[size=medium] 承接上一篇,以下是早上探讨的内容,纯粹是兴趣。
搜索了下hibernate的分页原理,我还没用过hibernate。有篇文章说hibernate的分页有3中机制,首先是根据不同的数据库组装具体数据库的分页sql,如mysql的getLimitString(),若数据库不支持那么使用游标定位,再不行,使用rs.next()一条一条定位。这个过程是很好理解的。所以我也看看ibatis是否是这么实现了的。当然第一种方式我在上一篇文章已经对于一般的数据库可以很好的实现了。
跟踪到com.ibatis.sqlmap.engine.execution.SqlExecutor.class.代码如下:
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);
}
}
可以看到确实是按照两种方式进行定位的,如果ResultSet的type是TYPE_FORWARD_ONLY那么采用的是游标一条一条定位,否则是absolute(int).一方面是这两种方式有差别吗?另一方面是我怎么让ibatis采用absolute定位。毕竟想当然觉得这个比较快。
我用200w+条数据测试了下,这两种方法差别不大,在200ms内。absolute确实快一点点,具体为什么可以查看其实现方式,不深入了。在做这个测试的时候就出现了outOfMemory问题,所以应该是强烈不建议用这个来分页,虽然你可能说你的内存有多大多大的。而且时间上也是一个问题。那么,怎么让ibatis使用absolute定位呢?有些数据库驱动是不支持absolute,last定位的,当然现在大部分是支持的,我们用的jconn3.jar是支持的。看看上面的代码,主要在这一句:
Integer rsType = statementScope.getStatement().getResultSetType();
看看ibatis是如何创建statementScope对象的
StatementScope statementScope = beginStatementScope(sessionScope, ms);
此时返回的statement中的ResultSetType是null,以后也并没有对其进行修改过,当然我们可以很容易的重写handleResults方法,或者在哪里对其ResultSet的Type进行赋值,但是这带来以后维护的问题。我在想是否可以在哪里配置这个呢?还有hibernate是否也一样的呢?即返回的ResultSet type都是ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY的?[/size]
分享到:
相关推荐
Ibatis SQLServerDialect 2008 分页 可实现SQLServerDialect 分页 支持ibatis3
ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件 ibatis_likehbm高效分页组件 ibatis_likehbm...
spring+ibatis+oracle分页缓存源码
ibatis实现分页技术,其中的分页都已经封装好了,大家需要的话可以下载下来看下
ibatis 物理分页jar ,与官方ibatis不冲突,可直接使用。
NULL 博文链接:https://tianke645.iteye.com/blog/876116
Ibatis 2.3.4 数据库无关分页 有示例,可以运行 网上找的很不错
Ibatis .net 分页 查询, 可以参考下, Ibatis .net 分页 查询
struts2+spring+ibatis+oracle+分页搜索+上传附件实例!完整版!
公司的大部分项目都开始使用IBatis作为O/R Mapping了,但是在使用的过程中也发现了很多不方便和存在争议的地方,其中一个不方便的地方就是分页,目前的处理方式都是在sqlMap中写针对特定数据库的物理分页Sql语句,对于...
简单公文管理 struts+spring+ibatis +ajax 分页
ibatis调用oracle存储过程分页
小弟新手,第一次发自己的项目,整合了ssi,实现了ibatis连接oracle的分页,这个分页没有网上说的那么复杂,只是拼了sql分页语句就可以了
底层 到 页面展示 , dao层 service层 action层 到tld 到jsp都是、已经写好 你只要调用就可以。非常好用的jsp分页标签(如果不明白的地方,可以私聊我)
ibatis 分页功能,使用了标签page.tld。本代码不能单独运行,技术能力欠缺或者代码阅读能力不是很好的朋友,请勿下载。
通过修改ibatis源码实现sql分页。由于ibatis默认分页是全部查出,然后再从中取出相应的数据实现分页,效率底。所以需要扩展
NULL 博文链接:https://joint.iteye.com/blog/557830
ibatis mybatis 分页 crud 完整代码 如有不清楚的地方:可访问公司网站:www.meihuangkeji.com 进一步交流讨论。
NULL 博文链接:https://sarin.iteye.com/blog/1026061
一直以来ibatis的分页都是通过滚动ResultSet实现的,应该算是逻辑分页吧。逻辑分页虽然能很干净地独立于特定数据库,但效率在多数情况下不及特定数据库支持的物理分页,而hibernate的分页则是直接组装sql,充分利用...