mybatis缓存机制
为了提高数据库性能,减轻数据库压力,mybatis提供了缓存机制。mybatis的缓存分为两级:一级缓存、二级缓存。一级缓存是SqlSession级别的缓存,缓存的数据只在SqlSession内有效。二级缓存是mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的。
mybatis一级缓存
mybatis的一级缓存是SqlSession级别的缓存,在操作数据库的时候需要先创建SqlSession会话对象,在对象中有一个HashMap用于存储缓存数据,此HashMap是当前会话对象私有的,别的SqlSession会话对象无法访问。mybatis的一级缓存默认是开启的。
mybatis二级缓存
二级缓存是mapper级别的缓存,也就是同一个namespace的mappe.xml,当多个SqlSession使用同一个Mapper操作数据库的时候,得到的数据会缓存在同一个二级缓存区域。二级缓存默认是没有开启的。
mybatis缓存问题
一级缓存,即session缓存,作用域为Session,当Session flush或close之后,该Session中的所有 Cache 就将清空,
二级缓存,即全局缓存,其作用域为Mapper(Namespace),默认关闭。
spring使用mybatis缓存问题
mybatis集成spring(使用mybatis-spring)时:每次查询spring会重新创建SqlSession,所以一级缓存是不生效的。而当开启事务时,spring会使用同一个SqlSession做查询,所以这个情况下一级缓存是生效的。