`
IvanLi
  • 浏览: 605146 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ibatis分页源码分析

阅读更多
在ibatis中有一个很吸引人的方法,queryForPaginatedList(java.lang.String id, int pageSize),可以返回 PaginatedList的对象,
实现翻页,刚才测试了一下PaginatedList,在1-2w行数据的时候还可以工作,但是在一个30w行的表里翻页,一次select用了363.031second
忍不住看了一下源,发现ibatis的分页依赖于数据库的jdbcDriver.

调用次序如下SqlMapClientImpl.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList
->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList
->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback
->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults()
分页处理的函数如下
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的分页机制要看jdbcDriver如何实现以及是否支持rs.absolute(skipResults)。
这种实现肯定不如数据库自己支持的分页方式来的快,一旦碰到数据量大的表,马上会死翘翘。
分享到:
评论
1 楼 zhkchi 2007-01-23  
可怕的是取得的数据要放在内存才行...

一多肯定死

问一下 2W的数据翻页用了多少时间>?


msn:zhkchi@hotmail.com

谢谢

相关推荐

    ibatis 之分页

    6. **源码分析**:理解Ibatis的源码有助于我们更好地利用其分页功能。例如,查看Executor的执行过程,了解参数是如何传递到SQL中的,以及如何与数据库交互。 7. **工具辅助**:除了PageHelper,还有其他如MyBatis-...

    ibatis分页

    标题中的“ibatis分页”指的是在使用iBATIS(一个SQL映射框架)时,如何实现数据库查询结果的分页显示。...对于进阶学习者,深入源码分析将帮助理解iBATIS的内部工作流程,从而更好地进行定制和优化。

    传智ibatis视频源码

    7. **插件机制**:Ibatis允许开发者自定义插件,拦截SQL执行过程,实现如日志记录、性能分析等功能,扩展性极强。 8. **事务管理**:Ibatis支持手动和自动的事务管理,理解何时提交、回滚事务,以及事务的隔离级别...

    mybatis分页插件源码

    这个插件的源码分析可以帮助我们深入理解其工作原理,从而更好地利用它来优化应用性能。 首先,`pom.xml` 文件是 Maven 项目的核心配置文件,用于定义项目依赖和构建过程。在 MyBatis 分页插件的源码中,`pom.xml` ...

    spring-ibatis-ext-plugin.1.0.0 扩展ibaits原生SQL

    通过分析ibatis源码知道,最终负责执行sql的类是 com.ibatis.sqlmap.engine.execution.SqlExecutor,此类没有实现任何接口,这多少有点遗憾,因为接口是相对稳定契约,非大 的版本更新,接口一般是不会变的,而类...

    ibatis学习资料汇总

    源码分析可以帮助开发者更好地定制和优化自己的应用。 六、iBatis实践项目 通过实践项目,可以加深对iBatis的理解和掌握。你可以创建一个简单的CRUD(创建、读取、更新、删除)应用,或者参与更复杂的业务逻辑,如...

    ibatis-2-mybatis-2.3.5.zip

    四、源码分析 iBatis的核心源码中,SqlSessionManager是整个框架的入口,负责创建SqlSession对象并管理事务。Executor接口及其实现类(SimpleExecutor、ReuseExecutor、BatchExecutor)是执行SQL的关键。在执行SQL...

    iBATIS入门讲解和程序源码+iBATIS开发指南电子书

    源码分析部分,我们可以看到iBATIS如何解析XML配置文件,如何通过反射机制调用Java方法,以及如何将查询结果自动映射到Java对象上。这对于理解iBATIS的工作流程及其内部机制至关重要。 在"iBATIS开发指南电子书"中...

    一个用ibatis框架开发的示例项目

    通过分析和实践,我们可以掌握如何配置Ibatis,编写动态SQL,管理事务,以及如何在Spring环境中优雅地使用Ibatis。这不仅有助于我们提升开发效率,也能使我们在实际项目中更好地应对复杂的数据访问需求。

    扩展 iBatis 以透明支持多种数据库

    例如,MySQL 和 Oracle 在语法上有差异,如分页查询、日期处理等。通过创建和注册新的方言类,可以确保 SQL 能够正确地在不同数据库上执行。 2. **数据源配置**:为了支持多种数据库,需要在 iBatis 的配置文件中...

    springMVC+spring+hibernate+jquery分页完整项目,完整代码

    本项目是一个基于SpringMVC、Spring、Hibernate和jQuery的完整分页应用,涵盖了后端服务、数据持久化、前端交互等多个重要技术...开发者可以通过分析源码,了解如何在实际项目中运用这些技术,从而提升自己的技能水平。

    struts1 +ibatis +mysql 做的产品管理系统

    Struts1、iBatis和MySQL是Web应用开发...总的来说,这个基于Struts1、iBatis和MySQL的产品管理系统提供了全面的产品管理功能,其源码的完整性使得开发者可以直接借鉴和学习,了解如何将这些技术有效整合到实际项目中。

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ │ 13.RPC底层通讯原理之Netty线程模型源码分析.wmv │ │ │ ├─14.分库分表之后分布式下如何保证ID全局唯一性 │ │ 14.分库分表之后分布式下如何保证ID全局唯一性.mp4 │ │ │ └─15.大型公司面试必答之...

    EAsyUI 学习

    在源码 _7609373.zip 中,你可以找到如何配置 DataGrid,以及实现分页功能的方法。了解 DataGrid 的基本使用和配置,能帮助你更好地展示和管理大量的结构化数据。 2. **EasyUI 项目实例** 文件 _7605957.zip 包含...

    .net源码生成工具DataBase2Sharp

     4、Web界面自动生成功能,生成列表、增加、修改界面代码和后台代码,包括烦琐的绑定数据和赋值语句代码,为你封装具有漂亮界面和布局的编辑、查看、添加和分页控件,随手可得,率性而为。  5、Enterprise Library...

    动力节点java课程.docx

    2. **Struts1**:了解其MVC架构,分析核心实现源码,学习ActionForm、ActionMapping等概念,以及国际化支持和Validator框架。 3. **Struts2**:对比Struts1,掌握Struts2的特性,如类型转换、拦截器、OGNL,以及与...

    struts项目1:网上企业办公自动化

    通过对源码的分析,开发者可以了解如何使用Struts2的注解来定义Action,如何处理表单提交,如何实现分页和搜索功能,以及如何进行错误和异常处理。此外,通过查看数据库设计,还可以了解到如何优化数据模型以满足...

Global site tag (gtag.js) - Google Analytics