[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实现分页的相关知识点,并基于提供的标签“源码”和“工具”,分享如何在实际项目中运用Ibatis进行分页处理。 首先,了解Ibatis的基本概念。Ibatis是由Apache基金会维护的一个开源项目,它是一...
Ibatis SQLServerDialect 2008 分页 可实现SQLServerDialect 分页 支持ibatis3
在描述中提到了一个博客链接,虽然具体内容没有给出,但通常博主会分享关于iBATIS分页实现的详细步骤、常见问题以及可能的解决方案。iBATIS的分页实现主要有两种方法: 1. **基于存储过程的分页**:在数据库层面...
总结一下,Ibatis 2.3.4的数据库无关分页特性提供了一种跨数据库的分页解决方案,通过动态SQL和参数传递,使得分页逻辑独立于具体的数据库方言。这种方式提高了代码的可复用性和可维护性,也降低了系统迁移的成本。...
ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件ibatis_likehbm高效分页组件 ibatis_likehbm高效分页组件 ibatis_likehbm...
为了简化代码,我们还可以自定义一个Ibatis分页插件,自动处理分页逻辑。例如,使用PageHelper插件,只需在配置中启用并设置相关参数,就可以自动实现分页。 四、总结 Ibatis实现分页技术主要依赖于SQL语句中的分页...
Spring、iBatis和Oracle的结合提供了强大的数据处理能力。本文将深入探讨这些技术如何协同工作,实现高效的分页缓存策略。 首先,Spring是一个开源的Java框架,它为开发人员提供了依赖注入(DI)和面向切面编程...
总结来说,这个基于ibatis的分页项目提供了一套完整的解决方案,从数据库查询到前端展示,都已准备就绪。开发者只需理解并调用已有的组件,就能快速实现分页功能,无需从头编写大量代码。对于初学者或者希望提高开发...
ibatis 物理分页jar ,与官方ibatis不冲突,可直接使用。
在本实例中,Spring用于集成其他组件,如Struts2和iBatis,同时,它还可以处理数据库事务,确保数据的一致性。此外,Spring的AOP特性可以用于实现日志记录、权限控制等通用功能。 3. **iBatis**:iBatis是一个持久...
在处理大量数据时,分页查询是必不可少的功能,可以有效地减少数据库负载并提高用户体验。Ibatis.NET提供了分页查询的实现,下面我们将深入探讨如何在Ibatis.NET中实现分页。 首先,理解分页的基本概念。分页通常...
5. Java服务层代码(如`UserService.java`):处理业务逻辑,包括调用iBATIS的SQL映射进行分页查询。 在iBATIS中实现分页通常有以下步骤: 1. **配置PageHelper插件**:如果你使用PageHelper,需要在项目中引入...
公司的大部分项目都开始使用IBatis作为O/R Mapping了,但是在使用的过程中也发现了很多不方便和存在争议的地方,其中一个不方便的地方就是分页,目前的处理方式都是在sqlMap中写针对特定数据库的物理分页Sql语句,对于...
综上所述,"简单公文管理 struts+spring+ibatis +ajax 分页"是一个集成了多种技术的Web应用,它利用Struts进行页面控制,Spring管理业务逻辑,iBatis处理数据访问,Ajax提升用户体验,共同构建了一个高效、易用的...
本知识点将深入探讨如何在Struts2框架中结合iBatis实现基于Freemarker模板的分页功能。 首先,我们需要理解iBatis,它是一个轻量级的Java持久层框架,它提供了一个SQL映射框架,允许开发者将SQL语句与Java代码分离...
Ibatis,作为一款轻量级的Java持久层框架,虽然功能强大,但在默认情况下,其分页方式是逻辑分页,即先查询所有数据,然后在应用程序层面进行分页处理,这种方式对于大数据量的查询来说,无疑会消耗大量的内存和CPU...
Struts2、Spring和iBatis是Java Web开发中常用的三个...在实际开发中,你还需要考虑异常处理、国际化、性能优化等方面,确保应用的稳定性和用户体验。通过熟练掌握这三个框架的组合,你可以构建出强大且灵活的Web应用。
在Spring与iBATIS结合的分页实现中,通常会使用Spring的DataSourceTransactionManager来处理事务,通过SqlSessionTemplate或SqlSessionFactoryBean进行数据库操作。分页功能主要通过以下步骤实现: 1. **配置**:在...
ibatis调用oracle存储过程分页
"Ibatis连接Oracle的分页"是指利用Ibatis作为数据访问层,与Oracle数据库进行交互,并实现了分页查询功能。Oracle数据库支持多种分页方式,如ROWNUM伪列、ROWNUM配合子查询、ROW_NUMBER()窗口函数等。在这个项目中,...