博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mybatis缓存机制与陷阱
阅读量:6265 次
发布时间:2019-06-22

本文共 674 字,大约阅读时间需要 2 分钟。

最近发现一段代码里相同的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",这样会清空缓存第二次会再去数据库查询.

转载地址:http://okcpa.baihongyu.com/

你可能感兴趣的文章
单节点Nginx+FastDFS安装配置<1>
查看>>
自制jquery可编辑的下拉框
查看>>
项目管理流程
查看>>
七鑫易维彭凡演讲实录:眼球追踪技术让VR更“人性”
查看>>
H3 BPM门户操作说明及实例介绍
查看>>
Undocumented MessageBoxTimeOut function
查看>>
简单的纯css菜单
查看>>
获双重认证,新华三又添双可信资质
查看>>
json \u unicode字符串转化 c++
查看>>
WinDbg 调试工具的使用
查看>>
最全linux命令
查看>>
Jexus部署.Net Core项目
查看>>
tomcat设置
查看>>
第十二单元 不同系统之间的文件传输
查看>>
安装mysql报错,错误提示:Incorrect definition of table mysql.proc
查看>>
网吧维护工具
查看>>
BOOT.INI文件参数
查看>>
Exchange-批量创建通讯组邮箱
查看>>
系统目录结构、ls命令、文件类型、alias命令
查看>>
win10 uwp 异步转同步
查看>>