MyBatis一级缓存失效的几种情况
1 MyBatis一级缓存概述
- MyBatis 的一级缓存是 SqlSession 级别的,通过同一个 SqlSession 对象查询的数据会被缓存,下次再查询相同的数据时,就会从缓存中直接获取,不会从数据库重新访问;
- 一般我们说到 MyBatis 的一级缓存时,都是针对查询操作而言的;
- MyBatis 的一级缓存是默认开启的。
2 四种失效的基本情况
- 不同的 SqlSession 对象对应不同的一级缓存,即使查询相同的数据,也要重新访问数据库;
- 同一个 SqlSession 对象,但是查询的条件不同;
- 同一个 SqlSession 对象两次查询期间执行了任何的“增删改”操作,无论这些“增删改”操作是否影响到了缓存的数据;
- 同一个 SqlSession 对象两次查询期间手动清空了缓存(调用了 SqlSession 对象的
clearCache()方法)。
3 几种特殊情况
- 如果在同一个 SqlSession 对象两次查询同一数据期间,我们使用另一个 SqlSession 对象修改了这个数据,那么这两次查询返回的结果依旧是相同的(说明 SqlSession 对象还是从一级缓存中获取了数据),即使数据已经发生了变化;
- 同理第一种情况,如果在同一个 SqlSession 对象两次查询同一数据期间,我们使用 Navicat、Mysql Workbench 等数据库管理工具修改了这一数据,那么这两次查询返回的结果依旧是相同的,即使数据已经发生了变化;
- 如果在同一个 SqlSession 对象两次查询同一数据期间,我们使用该对象“增删改”了与该数据无关的其它数据,并没有进行任何涉及该数据的操作,数据也没有发生变化,那么 MyBatis 的一级缓存依旧会失效,这延伸自 2 中的第 3 种情况;
- 如果在同一个 SqlSession 对象两次查询同一数据期间,我们又多次查询了其它数据(期间没有进行任何的“增删改”操作),那么数据库中的该数据没有发生变化,MyBatis 也会顺利从一级缓存中获取到该数据。
本文介绍了MyBatis一级缓存的工作原理及失效情况,包括不同SqlSession之间的独立性,查询条件变化,增删改操作以及手动清除缓存导致的失效。此外,还讨论了几种特殊情况下,如并发修改和无关操作如何影响一级缓存的效果。
4541





