Mybatis一级缓存和二级缓存理解

持久层框架:Mybatis

Mybatis提供查询缓存分为一级缓存和二级缓存,用于减轻数据库压力,提高数据库性能。

一级缓存的工作原理

一级缓存是SqlSession级别的缓存

  MyBatis的一级查询缓存是由 org.apache.ibatis.cache.impl.PerpetualCache 类的 HashMap本地缓存实现的,它的作用域则是SqlSession,它的作用域也就是生命周期,假如同一个SqlSession中执行两次sql语句的查询,这两次的查询的位置是不同的,第一次查询时,由于没有缓存结果则是从数据库中进行查询结果,得到结果后写入缓存并将结果返回给查询语句,而在进行第二次查询时,这时缓存中已经有符合条件的结果集,这次的查询就会在缓存获得结果并返回,而不会向数据库进行查询。当SqlSession结束后相应的缓存也就销毁了。 MyBatis默认一级查询时开启状态,而且不能关闭。

二级缓存的工作原理

二级缓存与一级缓存不同在于它更强大一些,强大在它的生命周期比一级缓存长,二级缓存的生命周期是与整个应用同步的,与应用同生共死,这个时候二级缓存就与SqlSession没有关系了。这是从它们两者的生命周期上来讲,除此之外它俩的用途目的也不一样,一级缓存是用来共享数据提升速度和效率的,而二级缓存则是为了延长查询结果的保存时间,从而提高系统性能而已,二级缓存也是可以用于共享数据的。 
       二级缓存在myBatis中有内置的,其实现类为 org.apache.ibatis.cache.impl.PerpetualCache,并且使用的时候实体类需要实现序列化接口,除了内置的之外还有一个ehcache,相对于内置的缓存来说这个是专业的,用起来也比较方便。

mybatis的二级缓存时mapper范围级别的,处理在sqlMapperConfig中设置二级缓存总开关,还要再具体的mapper中开启二级缓存。

sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到二级缓存中。

sqlSession2去查询用户id为1的用户信息,去缓存中找是否存在数据,如果存在直接从缓存中取出数据。

区别:
 

二级缓存与一级缓存区别,二级缓存的范围更大,是多个sqlSession可以共享同一个二级缓存区域。

UserMapper有一个二级缓存区域(按namespace区分),其他mapper(按namespace区分)也有自己的二级缓存区域

每一个namespace的mapper都有一个二级缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql所查询到的数据将存储在相同的二级缓存区域中。

缓存中重要的属性
禁用二级缓存
在statement中设置useCachefalse可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。

<select id=”findUserById” resultMap=”BaseResultMap” useCache=”false”>

总结:针对每次查询都需要最新的数据,需要设置成useCache=”false”,禁用二级缓存

刷新缓存(就是清空缓存)
在mapper的同一个namespace中如果有其他insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。

设置statement配置中的flushCache=”true”属性,默认情况下为true即刷新缓存,如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。
 

二级缓存的应用场景

很少被修改的数据

不是很重要的数据,允许出现偶尔并发的数据

不会被并发访问的数据

常用的缓存插件

EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。

redis:是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)

分布式缓存的典型应用场景可分为以下几类:
页面缓存.用来缓存Web 页面的内容片段,包括HTML、CSS 和图片等,多应用于社交网站等;
应用对象缓存.缓存系统作为ORM 框架的二级缓存对外提供服务,目的是减轻数据库的负载压力,加速应用访问;
状态缓存.缓存包括Session 会话状态及应用横向扩展时的状态数据等,这类数据一般是难以恢复的,对可用性要求较高,多应用于高可用集群;
并行处理.通常涉及大量中间计算结果需要共享;
事件处理.分布式缓存提供了针对事件流的连续查询(continuous query)处理技术,满足实时性需求;
极限事务处理.分布式缓存为事务型应用提供高吞吐率、低延时的解决方案,支持高并发事务请求处理,多应用于铁路、金融服务和电信等领域.

猜你喜欢

转载自blog.csdn.net/A___B___C/article/details/83717288