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ページング処理の関数は次のとおりです.
戻るPaginatedListは実際にはPaginatedDataListクラスのオブジェクトで、ページをめくるたびに最後に呼び出されます
この方法はiBATISのページングメカニズムがJDBC Driverがどのように実現するかとrs.absolute(skipResults)をサポートするかどうかを見ることができる.
この実装は、データベースが独自にサポートしているページング方式ほど速くないに違いありません.データ量の大きいテーブルに遭遇すると、停滞する可能性があります.
iBATISページングのソースコード分析はここまでで、iBATISページングの根本を理解してほしい.
出典:http://developer.51cto.com/art/200907/137212.htm
呼び出し順序は以下の通りである.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList
->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList
->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback
->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults()
iBATISページング処理の関数は次のとおりです.
- private void handleResults(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {
- try {
- request.setResultSet(rs);
- ResultMap resultMap = request.getResultMap();
- if (resultMap != null) {
- // Skip Results
- if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
- if (skipResults > 0) {
-
-
- rs.absolute(skipResults);
- }
- } else {
- for (int i = 0; i < skipResults; i++) {
- if (!rs.next()) {
- return;
- }
- }
- }
-
-
- // Get Results
- int resultsFetched = 0;
- while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults) && rs.next()) {
- Object[] columnValues = resultMap.resolveSubMap(request, rs).getResults(request, rs);
- callback.handleResultObject(request, columnValues, rs);
- resultsFetched++;
- }
- }
- } finally {
- request.setResultSet(null);
- }
- }
戻るPaginatedListは実際にはPaginatedDataListクラスのオブジェクトで、ページをめくるたびに最後に呼び出されます
- private List getList(int idx, int localPageSize) throws SQLException {
- return sqlMapExecutor.queryForList(statementName, parameterObject, (idx) * pageSize, localPageSize);
- }
この方法はiBATISのページングメカニズムがJDBC Driverがどのように実現するかとrs.absolute(skipResults)をサポートするかどうかを見ることができる.
この実装は、データベースが独自にサポートしているページング方式ほど速くないに違いありません.データ量の大きいテーブルに遭遇すると、停滞する可能性があります.
iBATISページングのソースコード分析はここまでで、iBATISページングの根本を理解してほしい.
出典:http://developer.51cto.com/art/200907/137212.htm