Mybatis一级缓存和结合Spring Framework后失效的源码探究
又因为通过 SqlSession 执行的操作,实际上由 Executor 来完成数据库操作的,所以在 Executor 中会建立一个简单的缓存,即一级缓存;将每次的查询结果缓存起来,再次执行查询的时候,会先查询一级缓存,如果命中,则直接返回,否则再去查询数据库并放入缓存中。 一级缓存的生命周期与 SqlSession 的生命周期相同,因此当 Mybatis 和Spring Framework 的集成包中扩展了一个 SqlSessionTemplate 类,所有的查询经过 SqlSessionTemplate 代理拦截后再进入到 DefaultSqlSession#selectList() 中,结束查询后把会话SqlSession 关了,所以导致了缓存失效。 原始的 Mybatis 有暴露 SqlSession 接口,因此有 close 方法暴露出来供你选择使用,你可以选择关与不关,但在Mybatis 和Spring Framework 的集成包中,SqlSession 是交给了Spring Framework 管理的,没有暴露出来,为了稳妥决定,直接给你关了。
用户评论