ws SQLException {
return connectionParent;
}
如何测定JDBC的性能(4)
时间:2010-12-18
第二,我们有返回ResultSets的方法。这些方法需要返回ResultSet的封装类。为了保证ResultSetWrapper的一致性,我们在StatementWrapper中添加了一个传递给其构建器的lastSqlString实例变量。当我们对特定的SQL语句进行性能监测时,该实例变量就非常有用了。返回ResultsSets的方法如下所示:
//StatementWrapper方法
public ResultSet getResultSet() throws SQLException {
return new ResultSetWrapper(realStatement.getResultSet(), this, lastSql);
}
public ResultSet executeQuery(String sql) throws SQLException {
return new ResultSetWrapper(realStatement.executeQuery(sql), this, sql);
}
//PreparedStatementWrapper方法
public ResultSet executeQuery() throws SQLException {
return new ResultSetWrapper(realPreparedStatement.executeQuery(), this, sql);
}
第三,一些方法使用了java.sql.Array对象。由于这些Array对象能够返回ResultSet,因此我们再次需要提供一个Array封装对象,以便返回ResultSetWrapper而不是普通的ResultSets。另外,我们还需要处理Array对象被传递给setArray()方法的情况:如果传递的是Array封装对象,则在被传递给PreparedStatement前,该对象需要被解封装:
public void setArray(int i, Array x) throws SQLException {
if (x instanceof SQLArrayWrapper)
realPreparedStatement.setArray(i, ((SQLArrayWrapper) x).realArray);
else
realPreparedStatement.setArray(i, x);
}
public Array getArray(int i) throws SQLException {
return new SQLArrayWrapper(realCallableStatement.getArray(i), this, sql);
}
最后,我们创建这些封装类的目的是能够实现性能的监测。我们要在下面的方法中添加测试JDBCLogger类性能的功能,这样每个方法都有一个对被封装在测试调用中的真正执行方法的调用。我们将sql字符串和当前的线程传递给测试调用,因为对于任何类型的测试调用来说,这二个参数都是十分重要的,尤其是在测量过程运行的时间时更是如此。另外,需要注意的是,我还重新定义了返回ResultSets的executeQuery()方法,以便在其中插入测试类:
//StatementWrapper方法
public void addBatch(String sql) throws SQLException {
realStatement.addBatch(sql);
lastSql = sql;
}
public boolean execute(String sql) throws SQLException {
Thread t = Thread.currentThread();
JDBCLogger.startLogSqlQuery(t, sql);
boolean b = realStatement.execute(sql);
JDBCLogger.endLogSqlQuery(t, sql);
lastSql = sql;
return b;
}
public int[] executeBatch() throws SQLException {
Thread t = Thread.currentThread();
JDBCLogger.startLogSqlQuery(t, "batch");
int[] i = realStatement.executeBatch();
JDBCLogger.endLogSqlQuery(t, "batch");
return i;
}
public ResultSet executeQuery(String sql) throws SQLException {
Thread t = Thread.currentThread();
JDBCLogger.startLogSqlQuery(t, sql);
ResultSet r = realStatement.executeQuery(sql);
JDBCLogger.endLogSqlQuery(t, sql);
lastSql = sql;
return new ResultSetWrapper(r, this, sql);
}
public int executeUpdate(String sql) throws SQLException {
Thread t = Thread.currentThread();
JDBCLogger.startLogSqlQuery(t, sql);
int i = realStatement.executeUpdate(sql);
JDBCLogger.endLogSqlQuery(t, sql);
lastSql = sql;
return i;
}
f
|