Mybatis一级缓存
MyBatis缓存
- 二级缓存的生命周期与程序是一个级别的,除非程序挂掉,不然,二级缓存一只都在。
- 一级缓存与会话绑定。
一级缓存命中场景
- 默认情况下,一级缓存时直接打开的
一级缓存源码解析
- 执行器执行的时候,查看缓存,如果缓存中没有,就去数据库中找,并且设置缓存
- 当
BaseExecutor
中出现update(),rollback(),falushCache(),commit(),LocalCacheScope()
时,就会调用clearLocalCache()
方法来清空缓存。
问题
spring
集成mybatis
,为什么会造成一级缓存失效?
- 。
mybatis
会把sqlSession
关闭了,所以每次查询都会创建新的sqlSession
,所以一级缓存根本不生效 - 又一个私有的内部类实现了
InvocationHandler
,SqlSessionTemplate
是DefaultSqlSession
的增强类,里面不直接调用CURD方法,而是通过一个代理对象,增强了所调用的方法,并且做了扩展。
- 会话之外更新数据怎么办?