国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

如何測定JDBC的性能(下)

2019-11-18 12:39:45
字體:
供稿:網(wǎng)友

  封裝ResultSet類
  ResultSetWrapper類也主要包括托付方法:
  public class ResultSetWrapper implements ResultSet
  {
  ResultSet realResultSet;
  StatementWrapper parentStatement;
  String sql;
  public ResultSetWrapper(ResultSet resultSet, StatementWrapper statement, String sql) {
  realResultSet = resultSet;
  parentStatement = statement;
  this.sql = sql;
  }
  public boolean absolute(int row) throws SQLException {
  return realResultSet.absolute(row);
  }
  ...
  其中也有一些方法不是簡單的托付方法,getStatement()方法返回生成ResultSet的statement對象,我們需要讓它返回StatementWrapper對象:
  public Statement getStatement() throws SQLException {
  return parentStatement;
  }
  The getArray() methods need to return a wrapped Array object:
  public Array getArray(int i) throws SQLException {
  return new SQLArrayWrapper(realResultSet.getArray(i), parentStatement, sql);
  }
  public Array getArray(String colName) throws SQLException {
  return new SQLArrayWrapper(realResultSet.getArray(colName), parentStatement, sql);
  }
  最后,我們需要添加測試過程。許多開發(fā)人員都錯誤地認為,不同的Statement.execute*()方法都會引起數(shù)據(jù)庫交互過程帶來的負擔,對于數(shù)據(jù)庫的更新和讀取少量的數(shù)據(jù)庫記錄而言,這是正確的。假如讀取的數(shù)據(jù)庫記錄的量較大,ResultSet.next()需要大量的時間從數(shù)據(jù)庫中讀取記錄。假如讀取的記錄太多,ResultSet.next()調(diào)用所需要的時間就會多于SQL語句執(zhí)行的時間。因此,測試ResultSet.next()調(diào)用的時間也就是理所當然的了。
  public boolean next() throws SQLException {
  Thread t = Thread.currentThread();
  JDBCLogger.startLogSqlNext(t, sql);
  boolean b = realResultSet.next();
  JDBCLogger.endLogSqlNext(t, sql);
  return b;
  }
  假如需要,還有一些ResultSet調(diào)用可以測量,例如PRevious()、insertRow()等,但大多數(shù)的應用程序只需要對next()進行測量。
  JDBC封裝類架構(gòu)
  上面討論了需要封裝的類,我沒有明確地說明Array和DatabaseMetaData的封裝類,但它們都比較簡單,只需要返回ResultSetWrappers和ConnectionWrappers而不是ResultSets和Connections類。使用封裝對象測試數(shù)據(jù)庫交互過程性能的技術(shù)適用于JDBC 1、JDBC 2和未來的JDBC 3,它們在接口定義方面互不相同(因此需要不同的封裝類。但我們可以用同一種方式創(chuàng)建所有不同版本下的封裝類。
  我沒有討論的是JDBCLogger,該類的一個簡單的實現(xiàn)中不調(diào)用測試方法,但將不提供測試功能:
  package tuning.jdbc;
  
  public class JDBCLogger
  {
  public static void startLogSqlQuery(Thread t, String sql) {}
  public static void endLogSqlQuery(Thread t, String sql) {}
  public static void startLogSqlNext(Thread t, String sql) {}
  public static void endLogSqlNext(Thread t, String sql) {}
  }
  一個更有用的定義是測試查詢的時間。下面的方法記錄查詢開始時的時間,并在查詢結(jié)束時得出使用的時間。由于假定在同一個線程中SQL查詢不能遞歸(一般情況下都是這樣的),下面的方法是相當簡單的:
  private static Hashtable QueryTime = new Hashtable();
  public static void startLogSqlQuery(Thread t, String sql)
  {
  if (QueryTime.get(t) != null)
  System.out.println("WARNING: overwriting sql query log time for " + sql);
  QueryTime.put(t, new Long(System.currentTimeMillis()));
  }
  public static void endLogSqlQuery(Thread t, String sql)
  {
  long time = System.currentTimeMillis();
  time -= ((Long) QueryTime.get(t)).longValue();
  System.out.println("Time: " + time + " millis for SQL query " + sql);
  QueryTime.remove(t);
  }
  使用JDBCLogger類中的這些方法的輸出將如下所示:
  Time: 53 millis for SQL query SELECT * FROM JACKTABL
  對于每次查詢執(zhí)行來說,這將使我們能夠精確地測試SQL查詢所使用的時間,也能夠計算出JDBCLogger類中所有查詢所需要的時間。我經(jīng)常測試的是最小、最大、平均、平均偏差等值,這些值在測試大規(guī)模的系統(tǒng)的性能時更有用。
  使用JDBC封裝類框架
  我們已經(jīng)介紹了非常有用的在應用程序的開發(fā)和布置階段測試JDBC調(diào)用性能的方法。由于封裝類比較簡單,而且功能強大,又不需要對應用程序進行大量的修改,它們可以被保留在已經(jīng)布置好的應用程序中,創(chuàng)建一個可配置的JDBCLogger類將使我們能夠根據(jù)自己的需要開啟或關閉測試功能。
  在開發(fā)階段,由于能夠計算出累積的時間代價,我們能夠利用這些類辨別出個別的需要較大時間代價的數(shù)據(jù)庫交互過程和重復的數(shù)據(jù)庫交互過程,哪個的時間代價更大。辨別出時間代價較大的數(shù)據(jù)庫交互過程是我們改進應用程序性能的第一步。在開發(fā)階段,這些封裝類可以用來發(fā)現(xiàn)應用程序的理論性能和實際性能之間的差距,有助于我們分析為什么會有差距。
  在利用這些類找出JDBC的性能瓶頸在哪里后,我們就可以對數(shù)據(jù)庫的接口進行調(diào)整了。我將在以后的文章中繼續(xù)討論JDBC性能的技術(shù)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 哈尔滨市| 昌都县| 贡嘎县| 曲阜市| 邳州市| 灌阳县| 敦化市| 乳山市| 靖远县| 翁牛特旗| 古田县| 高雄县| 健康| 邵东县| 上杭县| 嘉荫县| 邹城市| 康保县| 旌德县| 苗栗县| 名山县| 山丹县| 米林县| 桐庐县| 会泽县| 阿合奇县| 永安市| 玉环县| 白河县| 黎川县| 鹿泉市| 广南县| 邵阳市| 安吉县| 齐齐哈尔市| 武乡县| 雷山县| 平塘县| 交口县| 莎车县| 贵定县|