KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > h2 > test > bench > Database


1 /*
2  * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
3  * Initial Developer: H2 Group
4  */

5 package org.h2.test.bench;
6
7 import java.io.PrintWriter JavaDoc;
8 import java.lang.reflect.Method JavaDoc;
9 import java.sql.Connection JavaDoc;
10 import java.sql.DriverManager JavaDoc;
11 import java.sql.PreparedStatement JavaDoc;
12 import java.sql.ResultSet JavaDoc;
13 import java.sql.ResultSetMetaData JavaDoc;
14 import java.sql.Statement JavaDoc;
15 import java.util.ArrayList JavaDoc;
16 import java.util.Iterator JavaDoc;
17 import java.util.Properties JavaDoc;
18 import java.util.Random JavaDoc;
19 import java.util.StringTokenizer JavaDoc;
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 JavaDoc name, url, user, password;
31     private ArrayList JavaDoc replace = new ArrayList JavaDoc();
32     private String JavaDoc action;
33     private long startTime;
34     private Connection JavaDoc conn;
35     private Statement JavaDoc stat;
36     private boolean trace = true;
37     private long lastTrace;
38     private Random JavaDoc random = new Random JavaDoc(1);
39     private ArrayList JavaDoc results = new ArrayList JavaDoc();
40     private int totalTime;
41     private int executedStatements;
42     
43     private Server serverH2;
44     private Object JavaDoc serverDerby;
45     private boolean serverHSQLDB;
46     
47     String JavaDoc getName() {
48         return name;
49     }
50     
51     int getTotalTime() {
52         return totalTime;
53     }
54     
55     ArrayList JavaDoc getResults() {
56         return results;
57     }
58     
59     Random JavaDoc getRandom() {
60         return random;
61     }
62     
63     void startServer() throws Exception JavaDoc {
64         if(url.startsWith("jdbc:h2:tcp:")) {
65             serverH2 = Server.createTcpServer(new String JavaDoc[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 JavaDoc m = serverDerby.getClass().getMethod("start", new Class JavaDoc[]{PrintWriter JavaDoc.class});
70             m.invoke(serverDerby, new Object JavaDoc[]{null});
71             // serverDerby = new NetworkServerControl();
72
// serverDerby.start(null);
73
Thread.sleep(100);
74         } else if(url.startsWith("jdbc:hsqldb:hsql:")) {
75             if(!serverHSQLDB) {
76                 Class JavaDoc c = Class.forName("org.hsqldb.Server");
77                 Method JavaDoc m = c.getMethod("main", new Class JavaDoc[]{String JavaDoc[].class});
78                 m.invoke(null, new Object JavaDoc[]{new String JavaDoc[]{"-database.0", "data/mydb;hsqldb.default_table_type=cached", "-dbname.0", "xdb"}});
79                 // org.hsqldb.Server.main(new String[]{"-database.0", "mydb", "-dbname.0", "xdb"});
80
serverHSQLDB = true;
81                 Thread.sleep(100);
82             }
83         }
84     }
85     
86     void stopServer() throws Exception JavaDoc {
87         if(serverH2 != null) {
88             serverH2.stop();
89             serverH2 = null;
90         }
91         if(serverDerby != null) {
92             Method JavaDoc m = serverDerby.getClass().getMethod("shutdown", new Class JavaDoc[]{});
93             // cast for JDK 1.5
94
m.invoke(serverDerby, (Object JavaDoc[])null);
95             // serverDerby.shutdown();
96
serverDerby = null;
97         } else if(serverHSQLDB) {
98             // can not shut down (shutdown calls System.exit)
99
// openConnection();
100
// update("SHUTDOWN");
101
// closeConnection();
102
// serverHSQLDB = false;
103
}
104     }
105     
106     static Database parse(TestPerformance test, int id, String JavaDoc dbString) {
107         try {
108             StringTokenizer JavaDoc tokenizer = new StringTokenizer JavaDoc(dbString, ",");
109             Database db = new Database();
110             db.id = id;
111             db.test = test;
112             db.name = tokenizer.nextToken().trim();
113             String JavaDoc 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 JavaDoc e) {
124             System.out.println("Cannot load database " + dbString +" :" + e.toString());
125             return null;
126         }
127     }
128     
129     Connection JavaDoc getConnection() throws Exception JavaDoc {
130         Connection JavaDoc conn = DriverManager.getConnection(url, user, password);
131         if(url.startsWith("jdbc:derby:")) {
132             // Derby: use higher cache size
133
Statement JavaDoc 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 JavaDoc {
145         conn = DriverManager.getConnection(url, user, password);
146         stat = conn.createStatement();
147     }
148     
149     void closeConnection() throws Exception JavaDoc {
150 // if(!serverHSQLDB && url.startsWith("jdbc:hsqldb:")) {
151
// stat.execute("SHUTDOWN");
152
// }
153
conn.close();
154         stat = null;
155         conn = null;
156     }
157
158     public void setTranslations(Properties JavaDoc prop) {
159         String JavaDoc id = url.substring("jdbc:".length());
160         id = id.substring(0, id.indexOf(':'));
161         for(Iterator JavaDoc it = prop.keySet().iterator(); it.hasNext(); ) {
162             String JavaDoc key = (String JavaDoc)it.next();
163             if(key.startsWith(id + ".")) {
164                 String JavaDoc pattern = key.substring(id.length()+1);
165                 pattern = StringUtils.replaceAll(pattern, "_", " ");
166                 pattern = StringUtils.toUpperEnglish(pattern);
167                 String JavaDoc replacement = prop.getProperty(key);
168                 replace.add(new String JavaDoc[]{pattern, replacement});
169             }
170         }
171     }
172     
173     PreparedStatement JavaDoc prepare(String JavaDoc sql) throws Exception JavaDoc {
174         sql = getSQL(sql);
175         return conn.prepareStatement(sql);
176     }
177     
178     public String JavaDoc getSQL(String JavaDoc sql) {
179         for(int i=0; i<replace.size(); i++) {
180             String JavaDoc[] pair = (String JavaDoc[]) replace.get(i);
181             String JavaDoc pattern = pair[0];
182             String JavaDoc replace = pair[1];
183             sql = StringUtils.replaceAll(sql, pattern, replace);
184         }
185         return sql;
186     }
187     
188     void start(Bench bench, String JavaDoc 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 JavaDoc table) {
202         try {
203             update("DROP TABLE " + table);
204         } catch (Exception JavaDoc e) {
205             // ignore - table may not exist
206
}
207     }
208     
209     public void update(PreparedStatement JavaDoc prep) throws Exception JavaDoc {
210         prep.executeUpdate();
211         executedStatements++;
212     }
213
214     public void update(String JavaDoc sql) throws Exception JavaDoc {
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 JavaDoc {
225         conn.setAutoCommit(b);
226     }
227     
228     public void commit() throws Exception JavaDoc {
229         conn.commit();
230     }
231
232     public void rollback() throws Exception JavaDoc {
233         conn.rollback();
234     }
235
236     void trace(String JavaDoc 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 JavaDoc action) {
249         log(bench.getName() + ": " + action, "MB", TestBase.getMemoryUsed());
250     }
251     
252     void log(String JavaDoc action, String JavaDoc scale, int value) {
253         if(test.collect) {
254             results.add(new Object JavaDoc[]{action, scale, new Integer JavaDoc(value)});
255         }
256     }
257
258     public ResultSet JavaDoc query(PreparedStatement JavaDoc prep) throws Exception JavaDoc {
259 // long time = System.currentTimeMillis();
260
ResultSet JavaDoc rs = prep.executeQuery();
261 // time = System.currentTimeMillis() - time;
262
// if(time > 100) {
263
// System.out.println("time="+time);
264
// }
265
executedStatements++;
266         return rs;
267     }
268
269     public void queryReadResult(PreparedStatement JavaDoc prep) throws Exception JavaDoc {
270         ResultSet JavaDoc rs = prep.executeQuery();
271         ResultSetMetaData JavaDoc 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