mybatis中提供一级缓存以及二级缓存。
- 一级缓存 MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。 Executor对象中持有一个新的PerpetualCache对象; 当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。 SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据。 如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用,这也是为什么在spring中一级缓存失效的原因, Spring中代理类调用结束后就会close当前session。 如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。
在二级缓存的使用中,一个namespace下的所有操作语句,都影响着同一个Cache, 即二级缓存是被多个SqlSession共享着的,是一个全局的变量。 当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。
可以看这篇文章,https://www.jianshu.com/p/c553169c5921