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 种情况。
|