iBATISページングソースの真相検討


iBATISページのソースコードの真相の検討、まずiBATISの中で1つのとても人を引き付ける方法があって、queryForPaginatedList(java.lang.String id,int pageSize)は、PaginatedListの対象に戻って、ページをめくることを実現することができて、さっきPaginatedListをテストして、1-2 w行のデータの時にまだ仕事をすることができて、しかし1つの30 w行の表の中でページをめくって、1回のselectは363.031 secondを使って我慢できずにソースを見て、iBATISのページングはデータベースのJDBC Driverに依存することが分かった.
呼び出し順序は以下の通りである.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList
->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList
->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback
->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults()
iBATISページング処理の関数は次のとおりです.

  
  
  
  
  1. private void handleResults(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {  
  2.     try {  
  3.       request.setResultSet(rs);  
  4.       ResultMap resultMap = request.getResultMap();  
  5.       if (resultMap != null) {  
  6.         // Skip Results  
  7.         if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {  
  8.           if (skipResults > 0) {   
  9.  
  10.  
  11.             rs.absolute(skipResults);  
  12.           }  
  13.         } else {  
  14.           for (int i = 0; i < skipResults; i++) {  
  15.             if (!rs.next()) {  
  16.               return;  
  17.             }  
  18.           }  
  19.         }   
  20.  
  21.  
  22.         // Get Results  
  23.         int resultsFetched = 0;  
  24.         while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults) && rs.next()) {  
  25.           Object[] columnValues = resultMap.resolveSubMap(request, rs).getResults(request, rs);  
  26.           callback.handleResultObject(request, columnValues, rs);  
  27.           resultsFetched++;  
  28.         }  
  29.       }  
  30.     } finally {  
  31.       request.setResultSet(null);  
  32.     }  
  33.   } 

戻るPaginatedListは実際にはPaginatedDataListクラスのオブジェクトで、ページをめくるたびに最後に呼び出されます

  
  
  
  
  1. private List getList(int idx, int localPageSize) throws SQLException {   
  2.    return sqlMapExecutor.queryForList(statementName, parameterObject, (idx) * pageSize, localPageSize);  
  3.  } 

この方法はiBATISのページングメカニズムがJDBC Driverがどのように実現するかとrs.absolute(skipResults)をサポートするかどうかを見ることができる.
この実装は、データベースが独自にサポートしているページング方式ほど速くないに違いありません.データ量の大きいテーブルに遭遇すると、停滞する可能性があります.
iBATISページングのソースコード分析はここまでで、iBATISページングの根本を理解してほしい.
出典:http://developer.51cto.com/art/200907/137212.htm