iBATIS分页源码真相探讨
来源:互联网 发布:mysql并联 编辑:程序博客网 时间:2024/05/01 08:59
iBATIS分页源码真相的探讨,首先我们在iBATIS中有一个很吸引人的方法,queryForPaginatedList(java.lang.String id, int pageSize),可以返回 PaginatedList的对象,实现翻页,刚才测试了一下PaginatedList,在1-2w行数据的时候还可以工作,但是在一个30w行的表里翻页,一次select用了363.031second忍不住看了一下源,发现iBATIS的分页依赖于数据库的JDBC Driver.
调用次序如下SqlMapClientImpl.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList
->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList
->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback
->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults()
iBATIS分页处理的函数如下
- 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的分页机制要看JDBC Driver如何实现以及是否支持rs.absolute(skipResults)。
这种实现肯定不如数据库自己支持的分页方式来的快,一旦碰到数据量大的表,有停滞的可能。
iBATIS分页的源码分析就到这里,希望你能对iBATIS分页的根本有所了解。
出处:http://developer.51cto.com/art/200907/137212.htm
- iBATIS分页源码真相探讨
- iBATIS分页源码真相探讨
- 修改ibatis源码实现物理分页
- iBATIS分页
- ibatis 分页
- ibatis 分页
- ibatis分页 .
- ibatis 分页
- iBatis分页
- iBatis分页
- 探讨Spring框架使用真相
- 探讨Spring框架使用真相
- 探讨Spring框架使用真相
- 探讨Spring框架使用真相
- 探讨Spring框架使用真相
- 探讨Spring框架使用真相
- 探讨Spring框架使用真相
- 探讨Spring框架使用真相
- 各种编码的由来(很通俗)
- VS2005断点失效的问题
- Ubuntu10.04下安装tftp服务
- Android平台开发-WIFI function porting-WIFI功能移植
- java 生成随机码 字符数字图片等
- iBATIS分页源码真相探讨
- MFC Radio Button笔记
- 【转】.net数据库编程学习一:ADO.NET 结构
- mysql数据库学习及存过实例
- 【My Ora Life】Linux下Oracle使用
- mysqladmin: connect to server at 'localhost' failed?
- 验证控件-CompareValidator
- iBATIS教程之入门浅析
- 三维仓库技术方案