1 5 package org.h2.test.bench; 6 7 import java.io.PrintWriter ; 8 import java.lang.reflect.Method ; 9 import java.sql.Connection ; 10 import java.sql.DriverManager ; 11 import java.sql.PreparedStatement ; 12 import java.sql.ResultSet ; 13 import java.sql.ResultSetMetaData ; 14 import java.sql.Statement ; 15 import java.util.ArrayList ; 16 import java.util.Iterator ; 17 import java.util.Properties ; 18 import java.util.Random ; 19 import java.util.StringTokenizer ; 20 21 import org.h2.test.TestBase; 22 import org.h2.tools.Server; 23 import org.h2.util.JdbcUtils; 24 import org.h2.util.StringUtils; 25 26 class Database { 27 28 private TestPerformance test; 29 private int id; 30 private String name, url, user, password; 31 private ArrayList replace = new ArrayList (); 32 private String action; 33 private long startTime; 34 private Connection conn; 35 private Statement stat; 36 private boolean trace = true; 37 private long lastTrace; 38 private Random random = new Random (1); 39 private ArrayList results = new ArrayList (); 40 private int totalTime; 41 private int executedStatements; 42 43 private Server serverH2; 44 private Object serverDerby; 45 private boolean serverHSQLDB; 46 47 String getName() { 48 return name; 49 } 50 51 int getTotalTime() { 52 return totalTime; 53 } 54 55 ArrayList getResults() { 56 return results; 57 } 58 59 Random getRandom() { 60 return random; 61 } 62 63 void startServer() throws Exception { 64 if(url.startsWith("jdbc:h2:tcp:")) { 65 serverH2 = Server.createTcpServer(new String [0]).start(); 66 Thread.sleep(100); 67 } else if(url.startsWith("jdbc:derby://")) { 68 serverDerby = Class.forName("org.apache.derby.drda.NetworkServerControl").newInstance(); 69 Method m = serverDerby.getClass().getMethod("start", new Class []{PrintWriter .class}); 70 m.invoke(serverDerby, new Object []{null}); 71 Thread.sleep(100); 74 } else if(url.startsWith("jdbc:hsqldb:hsql:")) { 75 if(!serverHSQLDB) { 76 Class c = Class.forName("org.hsqldb.Server"); 77 Method m = c.getMethod("main", new Class []{String [].class}); 78 m.invoke(null, new Object []{new String []{"-database.0", "data/mydb;hsqldb.default_table_type=cached", "-dbname.0", "xdb"}}); 79 serverHSQLDB = true; 81 Thread.sleep(100); 82 } 83 } 84 } 85 86 void stopServer() throws Exception { 87 if(serverH2 != null) { 88 serverH2.stop(); 89 serverH2 = null; 90 } 91 if(serverDerby != null) { 92 Method m = serverDerby.getClass().getMethod("shutdown", new Class []{}); 93 m.invoke(serverDerby, (Object [])null); 95 serverDerby = null; 97 } else if(serverHSQLDB) { 98 } 104 } 105 106 static Database parse(TestPerformance test, int id, String dbString) { 107 try { 108 StringTokenizer tokenizer = new StringTokenizer (dbString, ","); 109 Database db = new Database(); 110 db.id = id; 111 db.test = test; 112 db.name = tokenizer.nextToken().trim(); 113 String driver = tokenizer.nextToken().trim(); 114 Class.forName(driver); 115 db.url = tokenizer.nextToken().trim(); 116 db.user = tokenizer.nextToken().trim(); 117 db.password = ""; 118 if(tokenizer.hasMoreTokens()) { 119 db.password = tokenizer.nextToken().trim(); 120 } 121 System.out.println("Loaded successfully: " + db.name); 122 return db; 123 } catch(Exception e) { 124 System.out.println("Cannot load database " + dbString +" :" + e.toString()); 125 return null; 126 } 127 } 128 129 Connection getConnection() throws Exception { 130 Connection conn = DriverManager.getConnection(url, user, password); 131 if(url.startsWith("jdbc:derby:")) { 132 Statement stat = null; 134 try { 135 stat = conn.createStatement(); 136 stat.execute("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.pageSize', '8192')"); 137 } finally { 138 JdbcUtils.closeSilently(stat); 139 } 140 } 141 return conn; 142 } 143 144 void openConnection() throws Exception { 145 conn = DriverManager.getConnection(url, user, password); 146 stat = conn.createStatement(); 147 } 148 149 void closeConnection() throws Exception { 150 conn.close(); 154 stat = null; 155 conn = null; 156 } 157 158 public void setTranslations(Properties prop) { 159 String id = url.substring("jdbc:".length()); 160 id = id.substring(0, id.indexOf(':')); 161 for(Iterator it = prop.keySet().iterator(); it.hasNext(); ) { 162 String key = (String )it.next(); 163 if(key.startsWith(id + ".")) { 164 String pattern = key.substring(id.length()+1); 165 pattern = StringUtils.replaceAll(pattern, "_", " "); 166 pattern = StringUtils.toUpperEnglish(pattern); 167 String replacement = prop.getProperty(key); 168 replace.add(new String []{pattern, replacement}); 169 } 170 } 171 } 172 173 PreparedStatement prepare(String sql) throws Exception { 174 sql = getSQL(sql); 175 return conn.prepareStatement(sql); 176 } 177 178 public String getSQL(String sql) { 179 for(int i=0; i<replace.size(); i++) { 180 String [] pair = (String []) replace.get(i); 181 String pattern = pair[0]; 182 String replace = pair[1]; 183 sql = StringUtils.replaceAll(sql, pattern, replace); 184 } 185 return sql; 186 } 187 188 void start(Bench bench, String action) { 189 this.action = bench.getName() + ": " + action; 190 this.startTime = System.currentTimeMillis(); 191 } 192 193 void end() { 194 long time = System.currentTimeMillis() - startTime; 195 log(action, "ms", (int)time); 196 if(test.collect) { 197 totalTime += time; 198 } 199 } 200 201 void dropTable(String table) { 202 try { 203 update("DROP TABLE " + table); 204 } catch (Exception e) { 205 } 207 } 208 209 public void update(PreparedStatement prep) throws Exception { 210 prep.executeUpdate(); 211 executedStatements++; 212 } 213 214 public void update(String sql) throws Exception { 215 sql = getSQL(sql); 216 if(sql.trim().length()>0) { 217 stat.execute(sql); 218 } else { 219 System.out.println("?"); 220 } 221 executedStatements++; 222 } 223 224 public void setAutoCommit(boolean b) throws Exception { 225 conn.setAutoCommit(b); 226 } 227 228 public void commit() throws Exception { 229 conn.commit(); 230 } 231 232 public void rollback() throws Exception { 233 conn.rollback(); 234 } 235 236 void trace(String action, int i, int max) { 237 if (trace) { 238 long time = System.currentTimeMillis(); 239 if (i == 0 || lastTrace == 0) { 240 lastTrace = time; 241 } else if (time > lastTrace + 1000) { 242 System.out.println(action + ": " + ((100 * i / max) + "%")); 243 lastTrace = time; 244 } 245 } 246 } 247 248 void logMemory(Bench bench, String action) { 249 log(bench.getName() + ": " + action, "MB", TestBase.getMemoryUsed()); 250 } 251 252 void log(String action, String scale, int value) { 253 if(test.collect) { 254 results.add(new Object []{action, scale, new Integer (value)}); 255 } 256 } 257 258 public ResultSet query(PreparedStatement prep) throws Exception { 259 ResultSet rs = prep.executeQuery(); 261 executedStatements++; 266 return rs; 267 } 268 269 public void queryReadResult(PreparedStatement prep) throws Exception { 270 ResultSet rs = prep.executeQuery(); 271 ResultSetMetaData meta = rs.getMetaData(); 272 int columnCount = meta.getColumnCount(); 273 while(rs.next()) { 274 for(int i=0; i<columnCount; i++) { 275 rs.getString(i+1); 276 } 277 } 278 } 279 280 int getExecutedStatements() { 281 return executedStatements; 282 } 283 284 public int getId() { 285 return id; 286 } 287 288 } 289 | Popular Tags |