java mybatis缓存机制_mybatis缓存机制与陷阱

最近发现一段代码里相同的2句查询sql,第一次通过数据库查询出来,第二次却没有走数据库直接得到结果,那么他自然是拿的缓存里的数据,于是去研究了一下mybatis的缓存机制.

mybatis缓存分为一级缓存和二级缓存

一级缓存是作用于sqlsession的,缓存的数据在同一个sqlsession内生效.

二级缓存是作用于mapper的,缓存的数据在同一个namespace内生效.

一级缓存

操作数据库前我们会先创建sqlsession对象,当同一个sqlsession查询2次相同的sql语句,第一次查询后会将查询到的数据写入缓存中,第二次再查询会直接拿缓存中的数据,不会再操作数据库,直到sqlsession执行了insert,update,delete操作并提交到数据库才会清空缓存,一级缓存是默认开启的.

二级缓存

二级缓存作用在mapper的同一个namespace,不同的sqlsession两次执行相同的namespace下的 sql语句,第一次会将查询到的数据写入缓存中,第二次再查询会直接拿缓存中的数据,二级缓存是默认关闭的.

明显之前的2次查询是不同的sqlsession,二级缓存又没有开启,那第二次查询又为何直接拿了缓存中的数据,经过一段时间的上网搜索,发现和我那段代码加了事务有关,mybatis在和spring集成后,会自动将session绑定到事务上,所以2次查询第二次会拿缓存中的结果.

解决办法

在mapper配置文件中,给select加上flushCache="true",这样会清空缓存第二次会再去数据库查询.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值