有时候我们需要一次性处理大量的数据几万甚至上百万,如果一次性加载到内存很可能导致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); } }
相关推荐
ibatis学习 ibatis总结 ibatis ibatis ibatis
ibatis 拼接字符串
学会ibatis 中sqlMap配置
ibatis官方中文文档.rar包含ibatis官方中文文档及使用说明
ibatis 乱码解决 ibatis乱码 gbk iso_8859_1 乱码
ibatis3.0中in的用法ibatis3.0中in的用法ibatis3.0中in的用法ibatis3.0中in的用法
ibatis2.0中文API ibatis2.0中文API ibatis2.0中文API 一对多 多对一详解,属性设置详解,解决方案详解,ibatis2.0核心API
ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料
ibatis中使用安全的拼接语句,动态查询,大于、小于、等于.doc
在此摘录中,两位作者将和你一起安装iBATIS并将其集成进你的Spring应用中。他们也阐明了怎样取得你已编写的SQL语句及把他们映射给iBATIS使用的Bean。最后,还讨论了iBATIS的优缺点,及为什么是这样的一种方式,即...
ibatis demo,ibatis例子,ibatis示例
iBATIS 级联iBATIS 级联iBATIS 级联
ibatise中关于iterate的用法的例子
iBatis中文教程 iBatis中文教程 iBatis中文教程 iBatis中文教程 iBatis中文教程
ibatis 中文手册,介绍了ibatis map sql的重要特性
书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。《iBATIS实战》的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该...
ibatis的原码 ibatis源码 ibatis源码 ibatis源码
最近遇到需要批量update数据的问题,一开始用了一个for循环去update,数据量大的时候效率很低。原因是for循环每次update一条语句,都是一次连接...在google上找了一遍,发现ibatis里有对批量update的支持,挺好的东西。
ibatis中输入输出各种类型的参数分析及#与$区别
ibatis中 $ 于 # 的 区别 ibatis中 $ 于 # 的 区别