mybatis分页插件缓存问题,求解

问题描述

有一个分页场景,前台通过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

解决方案

解决方案二:
我也用的mybatis分页插件,删除了一条数据,数据马上会变小,不存在缓存问题啊
解决方案三:
这个是不是浏览器缓存造成的,而不是程序的问题
解决方案四:
列表数据是会变少,但totalcount总数没变,导致本来有两页数据,删除一页后,列表只有一页的数据,但是下面页码还有2页,也不是浏览器缓存,打断点跟进去每次都是这样,而且我还试过换浏览器访问,还是一样的效果

时间: 2024-09-29 21:21:25

mybatis分页插件缓存问题,求解的相关文章

Mybatis 分页插件 PageHelper

Mybatis分页插件 - PageHelper 5.0.2 发布了.如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件. 该插件目前支持以下数据库的物理分页: Oracle Mysql MariaDB SQLite Hsqldb PostgreSQL DB2 SqlServer(2005,2008) Informix H2 SqlServer2012 Derby 使用 PageHelper 你只需要在 classpath 中包含 pagehelper-x.x.x.ja

mybatis分页插件pagehelper.PageHelper在使用全文索引查询时出错。

问题描述 mybatis分页插件pagehelper.PageHelper在使用全文索引查询时出错. 今天将sql语句进行更改后 发现的问题. 我这个语句的意思是:查询符合该关键词并且flag为1 的所有记录 sql语句测试没有什么问题,但是在使用PageHelper进行分页时发现 返回的 的集合结果信息错了 一共有两种方式错误 这个是调试信息输出的List结果:-->Page{pageNum=1, pageSize=10, startRow=0, endRow=10, total=1336,

自己动手写的mybatis分页插件(极其简单好用)_java

刚开始项目,需要用到mybatis分页,网上看了很多插件,其实实现原理基本都大同小异,但是大部分都只给了代码,注释不全,所以参考了很多篇文章(每篇文章偷一点代码,评出来自己的,半抄袭),才自己模仿着写出了一个适合自己项目的分页插件,话不多说,直接上代码,相比大部分文章,注释算很完整了 最重要的拦截器 package com.dnkx.interceptor; import java.sql.*; import java.util.HashMap; import java.util.Propert

Mybatis 分页插件 3.6.3 发布

Mybatis分页插件 - PageHelper如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件. 该插件目前支持以下数据库的物理分页: Oracle Mysql MariaDB SQLite Hsqldb PostgreSQL DB2 SqlServer(2005+) 3.6.3更新日志: 解决了一个潜在的bug,对通用Mapper中的SqlMapper进行分页时,需要使用这个版本 3.6.2更新日志: 本次更新只是增加了一个异常提示,当错误的配置了多个分页插件时,

Mybatis 分页插件 3.7.1 发布

Mybatis分页插件 - PageHelper如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件. 该插件目前支持以下数据库的物理分页: Oracle Mysql MariaDB SQLite Hsqldb PostgreSQL DB2 SqlServer(2005+) Informix 3.7.1更新日志: 增加Informix数据库支持,设置dialect值为informix即可 解决入参为不可变Map类型时的错误 Maven坐标 <dependency> &l

Mybatis 分页插件 PageHelper 5.0.2 发布

Mybatis分页插件 - PageHelper PageHelper 5.0.2 发布了.如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件.分页插件支持任何复杂的单表.多表分页,部分特殊情况请看重要提示.想要使用分页插件?请看如何使用分页插件. 该插件目前支持以下数据库的物理分页: Oracle Mysql MariaDB SQLite Hsqldb PostgreSQL DB2 SqlServer(2005,2008) Informix H2 SqlServer2

Mybatis 分页插件 3.3.0 发布

项目地址 gitosc地址:http://git.oschina.net/free/Mybatis_PageHelper github地址:https://github.com/pagehelper/Mybatis-PageHelper 如果你也在用Mybatis,建议尝试该分页插件,这个一定是最方便使用的分页插件. 该插件目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库分页. 经过近4个月的完善和反馈,3.3.0版本已经稳定,该版本相

MyBatis分页插件的使用——PageHelper

一,配置plugin    在myBatis的配置文件中,加入如下配置: <configuration> <!-- 配置分页插件 --> <plugins> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 指定使用的数据库是什么 --> <property name="dialect" value="mysql&quo

Java简单实现SpringMVC+MyBatis分页插件_java

1.封装分页Page类 package com.framework.common.page.impl; import java.io.Serializable; import com.framework.common.page.IPage; /** * * * */ public abstract class BasePage implements IPage, Serializable { /** * */ private static final long serialVersionUID