📄 tpcbexample.java
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1997, 1998, 1999, 2000 * Sleepycat Software. All rights reserved. * * $Id: TpcbExample.java,v 11.9 2000/04/01 15:52:15 dda Exp $ */package com.sleepycat.examples;import com.sleepycat.db.*;import java.io.FileNotFoundException;import java.util.Calendar;import java.util.Date;import java.util.Random;import java.util.GregorianCalendar;import java.math.BigDecimal;//// This program implements a basic TPC/B driver program. To create the// TPC/B database, run with the -i (init) flag. The number of records// with which to populate the account, history, branch, and teller tables// is specified by the a, s, b, and t flags respectively. To run a TPC/B// test, use the n flag to indicate a number of transactions to run (note// that you can run many of these processes in parallel to simulate a// multiuser test run).//class TpcbExample extends DbEnv{ public static final int TELLERS_PER_BRANCH = 10; public static final int ACCOUNTS_PER_TELLER = 10000; public static final int HISTORY_PER_BRANCH = 2592000; // // The default configuration that adheres to TPCB scaling rules requires // nearly 3 GB of space. To avoid requiring that much space for testing, // we set the parameters much lower. If you want to run a valid 10 TPS // configuration, uncomment the VALID_SCALING configuration // // VALID_SCALING configuration /* public static final int ACCOUNTS = 1000000; public static final int BRANCHES = 10; public static final int TELLERS = 100; public static final int HISTORY = 25920000; */ // TINY configuration /* public static final int ACCOUNTS = 1000; public static final int BRANCHES = 10; public static final int TELLERS = 100; public static final int HISTORY = 10000; */ // Default configuration public static final int ACCOUNTS = 100000; public static final int BRANCHES = 10; public static final int TELLERS = 100; public static final int HISTORY = 259200; public static final int HISTORY_LEN = 100; public static final int RECLEN = 100; public static final int BEGID = 1000000; // used by random_id() public static final int ACCOUNT = 0; public static final int BRANCH = 1; public static final int TELLER = 2; private static boolean verbose = false; private static final String progname = "TpcbExample"; // Program name. public TpcbExample(String home, int cachesize, boolean initializing, int flags) throws DbException, FileNotFoundException { super(0); set_error_stream(System.err); set_errpfx(progname); set_cachesize(0, cachesize == 0 ? 4 * 1024 * 1024 : cachesize, 0); int local_flags = flags | Db.DB_CREATE; if (initializing) local_flags |= Db.DB_INIT_MPOOL; else local_flags |= Db.DB_INIT_TXN | Db.DB_INIT_LOCK | Db.DB_INIT_LOG | Db.DB_INIT_MPOOL; open(home, local_flags, 0); // may throw DbException } // // Initialize the database to the specified number of accounts, branches, // history records, and tellers. // // Note: num_h was unused in the original ex_tpcb.c example. // public void populate(int num_a, int num_b, int num_h, int num_t) { Db dbp = null; int err; int balance, idnum; int end_anum, end_bnum, end_tnum; int start_anum, start_bnum, start_tnum; int h_nelem; idnum = BEGID; balance = 500000; h_nelem = num_a; try { dbp = new Db(this, 0); dbp.set_h_nelem(h_nelem); dbp.open("account", null, Db.DB_HASH, Db.DB_CREATE | Db.DB_TRUNCATE, 0644); } // can be DbException or FileNotFoundException catch (Exception e1) { errExit(e1, "Open of account file failed"); } start_anum = idnum; populateTable(dbp, idnum, balance, h_nelem, "account"); idnum += h_nelem; end_anum = idnum - 1; try { dbp.close(0); } catch (DbException e2) { errExit(e2, "Account file close failed"); } if (verbose) System.out.println("Populated accounts: " + String.valueOf(start_anum) + " - " + String.valueOf(end_anum)); // // Since the number of branches is very small, we want to use very // small pages and only 1 key per page. This is the poor-man's way // of getting key locking instead of page locking. // h_nelem = (int)num_b; try { dbp = new Db(this, 0); dbp.set_h_nelem(h_nelem); dbp.set_h_ffactor(1); dbp.set_pagesize(512); dbp.open("branch", null, Db.DB_HASH, Db.DB_CREATE | Db.DB_TRUNCATE, 0644); } // can be DbException or FileNotFoundException catch (Exception e3) { errExit(e3, "Branch file create failed"); } start_bnum = idnum; populateTable(dbp, idnum, balance, h_nelem, "branch"); idnum += h_nelem; end_bnum = idnum - 1; try { dbp.close(0); } catch (DbException dbe4) { errExit(dbe4, "Close of branch file failed"); } if (verbose) System.out.println("Populated branches: " + String.valueOf(start_bnum) + " - " + String.valueOf(end_bnum)); // // In the case of tellers, we also want small pages, but we'll let // the fill factor dynamically adjust itself. // h_nelem = (int)num_t; try { dbp = new Db(this, 0); dbp.set_h_nelem(h_nelem); dbp.set_h_ffactor(0); dbp.set_pagesize(512); dbp.open("teller", null, Db.DB_HASH, Db.DB_CREATE | Db.DB_TRUNCATE, 0644); } // can be DbException or FileNotFoundException catch (Exception e5) { errExit(e5, "Teller file create failed"); } start_tnum = idnum; populateTable(dbp, idnum, balance, h_nelem, "teller"); idnum += h_nelem; end_tnum = idnum - 1; try { dbp.close(0); } catch (DbException e6) { errExit(e6, "Close of teller file failed"); } if (verbose) System.out.println("Populated tellers: " + String.valueOf(start_tnum) + " - " + String.valueOf(end_tnum)); try { dbp = new Db(this, 0); dbp.set_re_len(HISTORY_LEN); dbp.open("history", null, Db.DB_RECNO, Db.DB_CREATE | Db.DB_TRUNCATE, 0644); } // can be DbException or FileNotFoundException catch (Exception e7) { errExit(e7, "Create of history file failed"); } populateHistory(dbp, num_h, num_a, num_b, num_t); try { dbp.close(0); } catch (DbException e8) { errExit(e8, "Close of history file failed"); } } public void populateTable(Db dbp, int start_id, int balance, int nrecs, String msg) { Defrec drec = new Defrec(); Dbt kdbt = new Dbt(drec.data); kdbt.set_size(4); // sizeof(int) Dbt ddbt = new Dbt(drec.data); ddbt.set_size(drec.data.length); // uses whole array try { for (int i = 0; i < nrecs; i++) { kdbt.set_recno_key_data(start_id + (int)i); drec.set_balance(balance); dbp.put(null, kdbt, ddbt, Db.DB_NOOVERWRITE); } } catch (DbException dbe) { System.err.println("Failure initializing " + msg + " file: " + dbe.toString()); System.exit(1); } } public void populateHistory(Db dbp, int nrecs, int anum, int bnum, int tnum) { Histrec hrec = new Histrec(); hrec.set_amount(10); byte arr[] = new byte[4]; // sizeof(int) int i; Dbt kdbt = new Dbt(arr); kdbt.set_size(arr.length); Dbt ddbt = new Dbt(hrec.data); ddbt.set_size(hrec.data.length); try { for (i = 1; i <= nrecs; i++) { kdbt.set_recno_key_data(i); hrec.set_aid(random_id(ACCOUNT, anum, bnum, tnum)); hrec.set_bid(random_id(BRANCH, anum, bnum, tnum)); hrec.set_tid(random_id(TELLER, anum, bnum, tnum)); dbp.put(null, kdbt, ddbt, Db.DB_APPEND); } } catch (DbException dbe) { errExit(dbe, "Failure initializing history file"); } } static Random rand = new Random(); public static int random_int(int lo, int hi) { int ret; int t; t = rand.nextInt(); if (t < 0) t = -t; ret = (int)(((double)t / ((double)(Integer.MAX_VALUE) + 1)) * (hi - lo + 1)); ret += lo; return (ret); } public static int random_id(int type, int accounts, int branches, int tellers) { int min, max, num; max = min = BEGID; num = accounts; switch(type) { case TELLER: min += branches; num = tellers; // Fallthrough case BRANCH: if (type == BRANCH) num = branches; min += accounts; // Fallthrough case ACCOUNT: max = min + num - 1; } return (random_int(min, max)); } public void run(int n, int accounts, int branches, int tellers) { Db adb = null; Db bdb = null; Db hdb = null; Db tdb = null; double gtps, itps; int failed, ifailed, ret, txns; long starttime, curtime, lasttime; // // Open the database files. // int err; try { adb = new Db(this, 0); adb.open("account", null, Db.DB_UNKNOWN, 0, 0); bdb = new Db(this, 0); bdb.open("branch", null, Db.DB_UNKNOWN, 0, 0); tdb = new Db(this, 0); tdb.open("teller", null, Db.DB_UNKNOWN, 0, 0); hdb = new Db(this, 0); hdb.open("history", null, Db.DB_UNKNOWN, 0, 0); } catch (DbException dbe) { errExit(dbe, "Open of db files failed"); } catch (FileNotFoundException fnfe) { errExit(fnfe, "Open of db files failed, missing file"); } txns = failed = ifailed = 0; starttime = (new Date()).getTime(); lasttime = starttime; while (n-- > 0) { txns++; ret = txn(adb, bdb, tdb, hdb, accounts, branches, tellers); if (ret != 0) { failed++; ifailed++; } if (n % 5000 == 0) { curtime = (new Date()).getTime(); gtps = (double)(txns - failed) / ((curtime - starttime) / 1000.0); itps = (double)(5000 - ifailed) / ((curtime - lasttime) / 1000.0); System.out.print(String.valueOf(txns) + " txns " + String.valueOf(failed) + " failed "); System.out.println(showRounded(gtps, 2) + " TPS (gross) " + showRounded(itps, 2) + " TPS (interval)"); lasttime = curtime; ifailed = 0; } } try { adb.close(0); bdb.close(0); tdb.close(0); hdb.close(0); } catch (DbException dbe2) { errExit(dbe2, "Close of db files failed"); } System.out.println((long)txns + " transactions begun " + String.valueOf(failed) + " failed"); } // // XXX Figure out the appropriate way to pick out IDs. // public int txn(Db adb, Db bdb, Db tdb, Db hdb, int anum, int bnum, int tnum) { Dbc acurs = null; Dbc bcurs = null; Dbc hcurs = null;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -