8 mybatis查询缓存

查询缓存的使用,主要是为了提高查询访问速度。将用户对同以数据的重复查询过程简化,不再每次均从数据库查询获取结果数据,从而提高访问速度。

mybatis的查询缓存机制,根据缓存区的作用域与生命周期可划分为两种:一级查询缓存与二级查询缓存。

mybatis查询缓存的作用域是根据映射文件mapper的namespace划分的,相同namespace的mapper查询数据存放在同一个缓存区域。不同namespace下的数据互不干扰。无论一级缓存还是二级缓存,都是按照namespace进行分别存放的。

但是一、二级缓存的不同之处在于,SqlSession一旦关闭,则SqlSession中的数据将不存在,即一级缓存就不覆存在。而二级缓存的生命周期与整个应用同步,与SqlSession是否关闭无关。也就是说,一级缓存是在同一SqlSession间共享数据,而二级缓存是在不同SqlSession间共享数据。


在这里插入图片描述

一级查询缓存

作用域是SqlSession,在同一个SqlSession中两次执行相同的sql查询语句,第一次执行完毕后,会将查询结果写入到缓存中,第二次会从缓存中直接获取数据,而不再到数据库中进行查询,从而提高了查询效率

增删改操作都会清空一级缓存,无论是否提交

当一个SqlSession结束后,该SqlSession中的一级查询缓存也就不存在了。mybatis默认一级查询缓存是开启状态,且不能关闭。

缓存的底层实现是一个Map,Map的value是查询结果
Map的key,即查询依据,使用的ORM架构不同,查询依据是不同的
mybatis的查询依据是:sql的id + SQL语句
hibernate的查询依据是:查询结果对象的id


内置二级缓存

由于mybatis从缓存中读取数据的依据与SQL的id相关,而非查询出的对象。所以,使用二级缓存的目的,不是在多个查询间共享查询结果(所有查询中只要查询结果中存在该对象的,就直接从缓存中读取,这是对查询结果的共享,Hibernate中的缓存就是为了在多个查询间共享查询结果,但mybatis的不是),而是为了防止同一查询(相同的sql id、相同的sql语句)的的反复执行
mybatis内置的二级缓存为org.apache.ibatis.cache.impl.PerpetualCache.

开启内置的二级缓存步骤

  1. 对实体进行序列化
  2. 在映射文件中添加<cache/>标签

注意事项

  • 增删改同样也会清空二级缓存
  • 对于二级缓存的清空,实质上是对所查找key对应的value的置为null,而并非将<key, value>对,即Entry对象删除
  • 从DB中进行select查询的条件是:
    1. 缓存中根本不存在这个key;
    2. 缓存中存在该key所对应的Entry对象,但其value为null;
二级缓存的配置

为<cache/>标签添加一些相关属性设置,可以对二级缓存的运行性能进行控制。当然若不指定设置,则均宝石默认值。

<cache eviction="FIFO" flushInterval="10800000" readOnly="true" size="512"/>
  • eviction:逐出策略。当二级缓存中的对象达到最大值时,就需要通过逐出策略将缓存中的对象移出缓存。默认为LRU。常用的策略有:
    1. FIFO:First In First Out,先进先出
    2. LRU:Least Recently Used,未被使用时间最长的
  • flushInterval:刷新缓存的时间间隔,单位毫秒。这里的刷新缓存即清空缓存。一般不指定,即当执行增删改时刷新缓存
  • readOnly:设置缓存中数据是否只读。只读的缓存会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改,这提供了很重要的性能优势。但读写的缓存会返回缓存对象的拷贝。这回慢一些,但是安全,因此默认是false;
  • size:二级缓存中可以存放的最多对象个数。默认为1024个
二级缓存的关闭

二级缓存默认为开启状态,若要将其关闭,则需要进行相关设置。根据关闭的范围大小,可以分为全局关闭与局部关闭

  1. 全局关闭:整个应用的二级缓存全部关闭,所有查询均不使用二级缓存。全局开关设置在主配置文件的全局设置<setting/>中,该属性为cacheEnabled,设置为false,则关闭;设置为true,则开启,默认值为true。即二级缓存默认是开启的
  2. 局部关闭:useCache="false"对当前sql的二级缓存的局部关闭
二级缓存的使用原则
  1. 多个namespace不要操作同一张表
  2. 不要再关联关系表上执行增删改操作(由于这个原因,二级缓存在实际工作中很少使用)
  3. 查询多余修改时使用二级缓存

ehcache二级缓存

mybatis的特长是sql操作,缓存数据管理不是其特长,为了提高缓存的性能,mybatis允许使用第三方缓存产品。ehCache就是其中的一种

注意使用ehcache二级缓存,实体类无需实现序列化接口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值