mybatis查询出的结果集和数据库查询的结果集不一致总结[一级缓存导致的深坑]

编程

1 检查你的返回类型,一般我们的返回是用 resultType 来接收,如果你的返回是用resultMap 来接收,就要考虑到map的特性,同key的会覆盖掉。我的先排除了这个情况

2 你的数据库表没设置主键,主键有重复导致的。

3 你的查询是做的主从分离,主从分离由于有延时性,导致你的查询出现问题。但我的查询没有这个问题,首先用的同一个库,第二,该数据早就插进去了,不需要进行同步这些工作。

4 你做了读写分离,但由于你的配置有问题,或者说脏数据,从库没有主库的数据。

5 代码bug。根源在mybatis的一级缓存。我的问题就是这种情况,上述的情况我都试了,最开始也怀疑过缓存问题,网上说mybatis的缓存是

flushCacheRequired

进行控制的,照着进行了操作,发现没生效,当时就以为不是缓存问题,但实际是这段代码有bug,具体就不贴了,来说说怎么排查的。

先看日志,日志中发现出现bug的时候,是没有打印SQL语句的,但我的打印是开启了的,这里开始怀疑是缓存问题,准备再次复查,再次检查,发现每次报错的代码都是同一个位置,检查这个ID,在上面看到打印的SQL确实是抽到指定数量的数据,跟踪下次报错的之前mybatis的查询。

这里的查询结果是两条,localCache 见名思意也知道是本地缓存,为什么这里就只有2条了呢,返回自己的代码,

我这里为了减少实体类的大小,进行了迭代器操作,使用后就删除,在mybatis中,如果是在同一个事务下,mybatis的一级缓存生效,我这里的操作由于是for循环的,要查询数据库多次,但多次之间有部分数据查询的参数是一样的,导致使用的缓存的数据,而缓存的数据又被我迭代器操作的时候删除了,从而出现这个问题,根源就在这里,将迭代器这里的删除操作去掉,查询结果集开始正常。

以上是 mybatis查询出的结果集和数据库查询的结果集不一致总结[一级缓存导致的深坑] 的全部内容, 来源链接: utcz.com/z/516035.html

回到顶部