⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tpcbexample.java

📁 嵌入式数据库Berkeley DB-4.5.20源代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        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 + -