Mybatis Local Cache陷阱

Local Cache陷阱

相关文档:mybatis configuration

相关代码:github

最近发现一个问题,当使用Spring Transaction的时候,发现对同一个sequence多次调用nextval返回的结果相同。经过一番搜索发现此问题和mybatis local cache有关。

在继续探讨这个问题之前,先搞清楚mybatis的cache类型:

local cache和cache

mybatis提供了两种cache类型:local cache和cache

要特别注意的是,mybatis的local cache是无法关闭的。

那么local cache干了什么?在默认配置情况下,mybatis会将同一session内的查询结果都放在local cache中,这样可以提高性能,避免每次都hit到数据库。

那么cache干了什么呢?和local cache相对的,cache是跨session的,也就是说这个session中缓存的结果,在另外一个session中也能够用到。

问题分析

前面已经讲到了在同一session中的查询会将结果缓存,那么这个和我们一开始提到的问题有什么关系呢?聪明的你一定已经想到了,这个问题和启用了事务有关。

实际上mybatis在和spring集成后,会自动将session绑定到事务上,那么就会产生前面提到的问题。

解决办法

有以下几种解决办法:

  1. 在mybatis配置文件中localCacheScope=STATEMENT

  2. 在mapper配置文件中,给select设置flushCache=true。需要注意的是,这样会将local cache和cache都清空掉。

  3. 不用事务

相关代码

  1. NativeTest:说明在使用SqlSession时,local cache的作用

  2. NoTxTest:说明在无事务时,local cache的作用

  3. TxTest:说明在有事务时,local cache的作用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值