mybatis+mysql分页事务问题

问题描述

有一个分页场景,前台通过ajax请求,后台用的mybatis分页插件,以下是插件配置:<propertyname="plugins"><list><beanclass="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor"><propertyname="dialect"><beanclass="com.github.miemiedev.mybatis.paginator.dialect.MySQLDialect"></bean></property></bean></list></property>

现在遇到一个问题,比如前台列表有10条数据,删除一条记录,然后再查询刷新列表,列表会少一条记录,但是分页的总数还是10条,这个分页总数是分页插件封装的,看了一下源码,里面有判断是否需要缓存,我把这条查询语句useCache设置为false,还是不行,源码如下:countTask=newCallable(){publicObjectcall()throwsException{Integercount=null;Cachecache=ms.getCache();if(cache!=null&&ms.isUseCache()){CacheKeycacheKey=executor.createCacheKey(ms,parameter,newPageBounds(),copyFromBoundSql(ms,boundSql,bufferSql.toString()));count=(Integer)cache.getObject(cacheKey);if(count==null){count=SQLHelp.getCount(bufferSql.toString(),ms,parameter,boundSql,dialect);cache.putObject(cacheKey,count);}}else{count=SQLHelp.getCount(bufferSql.toString(),ms,parameter,boundSql,dialect);}returnnewPaginator(page,limit,count);}};

如果过个几分钟再来查,分页总数就正常变成9条了,或者连续按F5刷新多次,分页总数也正常变化了,以下是插件源码执行分页的代码:ResultSetrs=null;try{connection=mappedStatement.getConfiguration().getEnvironment().getDataSource().getConnection();countStmt=connection.prepareStatement(count_sql);//PageSQL和CountSQL的参数是一样的,在绑定参数时可以使用一样的boundSqlDefaultParameterHandlerhandler=newDefaultParameterHandler(mappedStatement,parameterObject,boundSql);handler.setParameters(countStmt);rs=countStmt.executeQuery();intcount=0;if(rs.next()){count=rs.getInt(1);}logger.debug("Totalcount:{}",count);returncount;}finally{try{if(rs!=null){rs.close();}}finally{try{if(countStmt!=null){countStmt.close();}}finally{if(connection!=null&&!connection.isClosed()){connection.close();}}}}

以下是应用打出的日志,执行分页查询有15条记录,但是分页总数才7条,分页的SQL拿到数据库去查是20多条:09:43:16.631[http-8080-exec-5]DEBUGc.i.c.d.m.s.S.findCategoryProductByCondition-==>Preparing:SELECTtb.idasid,tb.key_wordASkeyWord,tb.brandasbrand,tb.product_modelASproductModel,tc.category_nameascategoryNameFROMt_shop_producttbLEFTJOINt_shop_categorytcONtb.category_id=tc.idwheretb.shop_id=?andtb.category_id=?limit1509:43:16.631[http-8080-exec-5]DEBUGc.i.c.d.m.s.S.findCategoryProductByCondition-==>Parameters:1(Long),63(Long)09:43:16.927[main-SendThread(192.168.0.125:2181)]DEBUGorg.apache.zookeeper.ClientCnxn-Gotpingresponseforsessionid:0x147ce0f26a44f1eafter817ms09:43:16.927[http-8080-exec-5]INFOjdbc.sqltiming-SELECTtb.idasid,tb.key_wordASkeyWord,tb.brandasbrand,tb.product_modelASproductModel,tc.category_nameascategoryNameFROMt_shop_producttbLEFTJOINt_shop_categorytcONtb.category_id=tc.idwheretb.shop_id=1andtb.category_id=63limit15{executedin296msec}09:43:16.927[http-8080-exec-5]DEBUGc.i.c.d.m.s.S.findCategoryProductByCondition-<==Total:1509:43:16.927[http-8080-exec-5]DEBUGc.g.m.m.paginator.support.SQLHelp-TotalcountSQL[selectcount(1)from(SELECTtb.idasid,tb.key_wordASkeyWord,tb.brandasbrand,tb.product_modelASproductModel,tc.category_nameascategoryNameFROMt_shop_producttbLEFTJOINt_shop_categorytcONtb.category_id=tc.idwheretb.shop_id=?andtb.category_id=?)tmp_count]09:43:16.927[http-8080-exec-5]DEBUGc.g.m.m.paginator.support.SQLHelp-TotalcountParameters:{shopId=1,categoryId=63}09:43:16.943[http-8080-exec-5]INFOjdbc.sqltiming-selectcount(1)from(SELECTtb.idasid,tb.key_wordASkeyWord,tb.brandasbrand,tb.product_modelASproductModel,tc.category_nameascategoryNameFROMt_shop_producttbLEFTJOINt_shop_categorytcONtb.category_id=tc.idwheretb.shop_id=1andtb.category_id=63)tmp_count{executedin0msec}09:43:16.943[http-8080-exec-5]DEBUGc.g.m.m.paginator.support.SQLHelp-Totalcount:7

解决方案

本帖最后由 i_am_sandy 于 2014-09-19 10:10:04 编辑

时间: 2025-01-26 21:26:28

mybatis+mysql分页事务问题的相关文章

MySQL分页方法

环境 MySQL 5.1 + 命令行工具 问题 MySQL分页 解决 --创建测 试表 create table test ( id int(11) primary key auto_increment, name varchar(20) not null ); --插入数据 mysql> insert into test(name) values('test1'); Query OK, 1 row affected (0.16 sec) mysql> insert into test(nam

mybatis的分页异常

问题描述 大家好.本人用了mybatis实现分页查询,数据库采用mysql.当执行sql语句为:selectID,USERID,RESOURCE_ID,RESOURCE_NAME,IP_ADDRESS,OPER_TIME,MAC_ADDRESS,TYPEfromT_PORTAL_LOG_OPERwhere1=1limit0,15 mybatis无异常,结果值能够注入到List中.但是当sql为:selectID,USERID,RESOURCE_ID,RESOURCE_NAME,IP_ADDRES

SpringMVC+MyBatis声明式事务管理_java

采用的基本搭建环境:SpringMVC.MyBatis.MySQL.tomcat         Spring事务管理分解了传统的全局事务管理和本地事务管理的劣势,使得在任何环境中都可以使用统一的事务管理模型,你可以写一次代码,然后在不同的环境从你的代码里面配置不同的事务管理策略,Spring提供两种事务管理策略:一种是声明式事务管理策略,另一种是编程式事务管理策略,这里主要介绍声明式事务管理策略 由于采用的是SpringMVC. MyBatis,故统一采用了标注来声明Service.Contr

Mybatis全面分页插件_java

根据下面分页的思想,很容易实现Mybitas的多租户设计.  使用Mybatis提供的拦截器.对分页的SQL语句通过封装处理,处理成不同的分页sql.  本例已经实现了对Mysql和Oracle的分页功能.注意下面的引用包,不要引用错了.  import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import ja

php+mysql分页处理的探讨

mysql|分页 php+mysql分页处理的探讨常见的分页处理流程为:1.用select count(*) from tbl_name取得待分页的总记录数2.根据每页的记录数计算出总页数:总页数 = ceil(总记录数/每页记录数)3.根据当前页号计算出起始位置:起始位置 = (当前页号-1)*每页记录数4.用select * from tbl_name limit 起始位置,每页记录数 取得待显示记录5.列表输出相关信息 在这个流程中,数据库需要两次遍历表才能得到所需数据.尽管limit会在

MySQL分页技术、6种分页方法总结

  这篇文章主要介绍了MySQL分页技术.6种分页方法总结,本文总结了6种分页的方法并分别一一讲解它们的特点,需要的朋友可以参考下 概述 有朋友问: MySQL的分页似乎一直是个问题,有什么优化方法吗? 网上看到赶集网XX推荐了一些分页方法,但似乎不太可行,你能点评一下吗? 方法总结 方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N 适应场景: 适用于数据量较少的情况(元组百/千级) 原因/缺点: 全表扫描

mysql的事务运作

  mysql的事务运作 早就想写了,一直忘了,其实很简单 就三条命令 start transaction commit rollback 现在来解释下: start transaction; 就是开始事务追踪的命令 开始前一定记得写 然后 commit; 这个的意思是说确认提交,执行这个命令就不能rollback了,相当于执行完毕. 最后 rollback; 这个命令很简单,回滚到start transaction时候的状态 现在举例 mysql> select * from useracco

php与mysql分页问题,为什么别的界面都能用单独这个的下一页不能用,这么写有问题,该怎样修改

问题描述 php与mysql分页问题,为什么别的界面都能用单独这个的下一页不能用,这么写有问题,该怎样修改 function get_links_list_all($key) { $result = get_filter(); if ($result === false) { $filter = array(); $filter['sort_by'] = empty($_REQUEST['sort_by']) ? 'user_id' : trim($_REQUEST['sort_by']); $

mybatis+mysql 一表主键自增, 插入数据,怎么返回主键

问题描述 mybatis+mysql 一表主键自增, 插入数据,怎么返回主键 mybatis+mysql 一表主键自增, 插入数据,怎么返回主键.很多人说的都是返回了插入的行数 解决方案 <insert id="insert" parameterType="Person" useGeneratedKeys="true" keyProperty="id"> insert into person(name,pswd)