`
xinglongbing
  • 浏览: 146609 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Ibatis中的RowHandler

 
阅读更多

    有时候我们需要一次性处理大量的数据几万甚至上百万,如果一次性加载到内存很可能导致OOM。如果使用Ibatis作为ORM映射工具,我们会用到RowHandler这个接口来处理。Ibatis中大致的实现思路是通过RowHandlerCallback封装一个RowHander对象从而在迭代都去每条记录时回调handleRow方法从而避免一次性全部加载到内存。不过需要注意的一点是:如果你的handleRow方法处理逻辑比较耗时这种方式处理的数据量很大的话可能大幅增加jdbc连接占用的时间,可能导致连接池吃紧的状况出现。ibatis.2.3.4.76版本处理入口在:

MappedStatement.executeQueryWithRowHandler(StatementScope statementScope, Transaction trans, Object parameterObject, RowHandler rowHandler)

具体细节见:

SqlExecutor.java

private void handleResults(StatementScope statementScope, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {
    try {
      statementScope.setResultSet(rs);
      ResultMap resultMap = statementScope.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(statementScope, rs).getResults(statementScope, rs);
          callback.handleResultObject(statementScope, columnValues, rs);
          resultsFetched++;
        }
      }
    } finally {
      statementScope.setResultSet(null);
    }
  }

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics