📄 tpcbexample.java
字号:
public void run() { double gtps, itps; int n, ret; long start_time, end_time; // // Open the database files. // int err; try { DatabaseConfig config = new DatabaseConfig(); config.setTransactional(true); adb = dbenv.openDatabase(null, "account", null, config); bdb = dbenv.openDatabase(null, "branch", null, config); tdb = dbenv.openDatabase(null, "teller", null, config); hdb = dbenv.openDatabase(null, "history", null, config); } catch (DatabaseException dbe) { TpcbExample.errExit(dbe, "Open of db files failed"); } catch (FileNotFoundException fnfe) { TpcbExample.errExit(fnfe, "Open of db files failed, missing file"); } start_time = (new Date()).getTime(); for (txns = n = ntxns, failed = 0; n-- > 0;) if ((ret = txn()) != 0) failed++; end_time = (new Date()).getTime(); if (end_time == start_time) end_time++; System.out.println(getName() + ": " + (long)txns + " txns: " + failed + " failed, " + TpcbExample.showRounded( (txns - failed) / (double)(end_time - start_time), 2) + " TPS"); try { adb.close(); bdb.close(); tdb.close(); hdb.close(); } catch (DatabaseException dbe2) { TpcbExample.errExit(dbe2, "Close of db files failed"); } } // // XXX Figure out the appropriate way to pick out IDs. // int txn() { Cursor acurs = null; Cursor bcurs = null; Cursor hcurs = null; Cursor tcurs = null; Transaction t = null; Defrec rec = new Defrec(); Histrec hrec = new Histrec(); int account, branch, teller; DatabaseEntry d_dbt = new DatabaseEntry(); DatabaseEntry d_histdbt = new DatabaseEntry(); DatabaseEntry k_dbt = new DatabaseEntry(); DatabaseEntry k_histdbt = new DatabaseEntry(); account = TpcbExample.this.random_id(TpcbExample.ACCOUNT); branch = TpcbExample.this.random_id(TpcbExample.BRANCH); teller = TpcbExample.this.random_id(TpcbExample.TELLER); // The history key will not actually be retrieved, // but it does need to be set to something. byte[] hist_key = new byte[4]; k_histdbt.setData(hist_key); k_histdbt.setSize(4 /* == sizeof(int)*/); byte[] key_bytes = new byte[4]; k_dbt.setData(key_bytes); k_dbt.setSize(4 /* == sizeof(int)*/); d_dbt.setData(rec.data); d_dbt.setUserBuffer(rec.length(), true); hrec.set_aid(account); hrec.set_bid(branch); hrec.set_tid(teller); hrec.set_amount(10); // Request 0 bytes since we're just positioning. d_histdbt.setPartial(0, 0, true); // START PER-TRANSACTION TIMING. // // Technically, TPCB requires a limit on response time, you only // get to count transactions that complete within 2 seconds. // That's not an issue for this sample application -- regardless, // here's where the transaction begins. try { t = dbenv.beginTransaction(null, null); acurs = adb.openCursor(t, null); bcurs = bdb.openCursor(t, null); tcurs = tdb.openCursor(t, null); hcurs = hdb.openCursor(t, null); // Account record k_dbt.setRecordNumber(account); if (acurs.getSearchKey(k_dbt, d_dbt, null) != OperationStatus.SUCCESS) throw new Exception("acurs get failed"); rec.set_balance(rec.get_balance() + 10); acurs.putCurrent(d_dbt); // Branch record k_dbt.setRecordNumber(branch); if (bcurs.getSearchKey(k_dbt, d_dbt, null) != OperationStatus.SUCCESS) throw new Exception("bcurs get failed"); rec.set_balance(rec.get_balance() + 10); bcurs.putCurrent(d_dbt); // Teller record k_dbt.setRecordNumber(teller); if (tcurs.getSearchKey(k_dbt, d_dbt, null) != OperationStatus.SUCCESS) throw new Exception("ccurs get failed"); rec.set_balance(rec.get_balance() + 10); tcurs.putCurrent(d_dbt); // History record d_histdbt.setPartial(0, 0, false); d_histdbt.setData(hrec.data); d_histdbt.setUserBuffer(hrec.length(), true); if (hdb.append(t, k_histdbt, d_histdbt) != OperationStatus.SUCCESS) throw new DatabaseException("put failed"); acurs.close(); acurs = null; bcurs.close(); bcurs = null; tcurs.close(); tcurs = null; hcurs.close(); hcurs = null; // null out t in advance; if the commit fails, // we don't want to abort it in the catch clause. Transaction tmptxn = t; t = null; tmptxn.commit(); // END TIMING return (0); } catch (Exception e) { try { if (acurs != null) acurs.close(); if (bcurs != null) bcurs.close(); if (tcurs != null) tcurs.close(); if (hcurs != null) hcurs.close(); if (t != null) t.abort(); } catch (DatabaseException dbe) { // not much we can do here. } if (TpcbExample.this.verbose) { System.out.println("Transaction A=" + String.valueOf(account) + " B=" + String.valueOf(branch) + " T=" + String.valueOf(teller) + " failed"); System.out.println("Reason: " + e.toString()); } return (-1); } } } private static void usage() { System.err.println( "usage: TpcbExample [-fiv] [-a accounts] [-b branches]\n" + " [-c cachesize] [-h home] [-n transactions]\n" + " [-T threads] [-S seed] [-s history] [-t tellers]"); System.exit(1); } private static void invarg(String str) { System.err.println("TpcbExample: invalid argument: " + str); System.exit(1); } public static void errExit(Exception err, String s) { System.err.print(progname + ": "); if (s != null) { System.err.print(s + ": "); } System.err.println(err.toString()); System.exit(1); } public static void main(String[] argv) throws java.io.IOException { File home = new File("TESTDIR"); int accounts = ACCOUNTS; int branches = BRANCHES; int tellers = TELLERS; int history = HISTORY; int threads = 1; int mpool = 0; int ntxns = 0; boolean iflag = false; boolean txn_no_sync = false; long seed = (new GregorianCalendar()).get(Calendar.SECOND); for (int i = 0; i < argv.length; ++i) { if (argv[i].equals("-a")) { // Number of account records if ((accounts = Integer.parseInt(argv[++i])) <= 0) invarg(argv[i]); } else if (argv[i].equals("-b")) { // Number of branch records if ((branches = Integer.parseInt(argv[++i])) <= 0) invarg(argv[i]); } else if (argv[i].equals("-c")) { // Cachesize in bytes if ((mpool = Integer.parseInt(argv[++i])) <= 0) invarg(argv[i]); } else if (argv[i].equals("-f")) { // Fast mode: no txn sync. txn_no_sync = true; } else if (argv[i].equals("-h")) { // DB home. home = new File(argv[++i]); } else if (argv[i].equals("-i")) { // Initialize the test. iflag = true; } else if (argv[i].equals("-n")) { // Number of transactions if ((ntxns = Integer.parseInt(argv[++i])) <= 0) invarg(argv[i]); } else if (argv[i].equals("-S")) { // Random number seed. seed = Long.parseLong(argv[++i]); if (seed <= 0) invarg(argv[i]); } else if (argv[i].equals("-s")) { // Number of history records if ((history = Integer.parseInt(argv[++i])) <= 0) invarg(argv[i]); } else if (argv[i].equals("-T")) { // Number of threads if ((threads = Integer.parseInt(argv[++i])) <= 0) invarg(argv[i]); } else if (argv[i].equals("-t")) { // Number of teller records if ((tellers = Integer.parseInt(argv[++i])) <= 0) invarg(argv[i]); } else if (argv[i].equals("-v")) { // Verbose option. verbose = true; } else { usage(); } } rand.setSeed((int)seed); // Initialize the database environment. // Must be done in within a try block. // TpcbExample app = null; try { app = new TpcbExample(home, accounts, branches, tellers, history, mpool, iflag || txn_no_sync); } catch (Exception e1) { errExit(e1, "initializing environment failed"); } if (verbose) System.out.println((long)accounts + " Accounts, " + String.valueOf(branches) + " Branches, " + String.valueOf(tellers) + " Tellers, " + String.valueOf(history) + " History"); if (iflag) { if (ntxns != 0) usage(); app.populate(); } else { if (ntxns == 0) usage(); app.run(ntxns, threads); } // Shut down the application. try { app.close(); } catch (DatabaseException dbe2) { errExit(dbe2, "appexit failed"); } System.exit(0); }};// Simulate the following C struct:// struct Defrec {// u_int32_t id;// u_int32_t balance;// u_int8_t pad[RECLEN - sizeof(int) - sizeof(int)];// };class Defrec { public Defrec() { data = new byte[TpcbExample.RECLEN]; } public int length() { return TpcbExample.RECLEN; } public long get_id() { return TpcbExample.get_int_in_array(data, 0); } public void set_id(long value) { TpcbExample.set_int_in_array(data, 0, value); } public long get_balance() { return TpcbExample.get_int_in_array(data, 4); } public void set_balance(long value) { TpcbExample.set_int_in_array(data, 4, value); } static { Defrec d = new Defrec(); d.set_balance(500000); } public byte[] data;}// Simulate the following C struct:// struct Histrec {// u_int32_t aid;// u_int32_t bid;// u_int32_t tid;// u_int32_t amount;// u_int8_t pad[RECLEN - 4 * sizeof(u_int32_t)];// };class Histrec { public Histrec() { data = new byte[TpcbExample.RECLEN]; } public int length() { return TpcbExample.RECLEN; } public long get_aid() { return TpcbExample.get_int_in_array(data, 0); } public void set_aid(long value) { TpcbExample.set_int_in_array(data, 0, value); } public long get_bid() { return TpcbExample.get_int_in_array(data, 4); } public void set_bid(long value) { TpcbExample.set_int_in_array(data, 4, value); } public long get_tid() { return TpcbExample.get_int_in_array(data, 8); } public void set_tid(long value) { TpcbExample.set_int_in_array(data, 8, value); } public long get_amount() { return TpcbExample.get_int_in_array(data, 12); } public void set_amount(long value) { TpcbExample.set_int_in_array(data, 12, value); } public byte[] data;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -