欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mybatis 缓存

程序员文章站 2022-06-18 23:34:45
...

mybatis 的缓存机制

mybatis 一级缓存

一级缓存也称之为本地缓存,默认会开启,一级缓存存在于sqlSesssion 的生命周期中,在同一个 sqlSesssion 中查询 时, MyBatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个 Map 对象中。如果同一个 sqlSesssion 中执行的方法和参数完全一致,那么通过算法会生成相同的 键值,当 Map 缓存对象中己经存在该键值时,则会返回缓存中的对象。
MyBatis 中sqlSesssion 本身是一个快速创建和销毁的类 ,在spring集成的项目中,都是由spring来自行管理,通常一个执行sql语句就创建一个 sqlSesssion 。

同一个sqlSession中,避免脏读情况例如第一次执行selectByid(11),查出来为user1,修改user1.setName(“脏数据”); 再执行selectByid(11),命中一级缓存,返回的user2 ,user2.getName();
获得出来的名字就是’'脏数据",避免这种情况使用如下查询:

<select id=” selectByid” flushCache=”true” resultMap=’”userMap”> select * from sys user where id = #{id}</select>

flushCache =“true” 刷新缓存,每次查询都会清空上一次缓存,从数据库执行查询sql

mybatis 二级缓存

MyBatis 的二级缓存非常强大,可以理解为存在于 同一个SqlSessionFactory 的生命周期中 ,,当存在多个 SqlSessioηFactory 时, 它 们的缓存都是绑定在各自对象上的,缓存数据在一般情况下是不相通的。只有在使用如 Redis 这样的缓存数据库时,才可以共享缓存。

2.1 配置二级缓存

在 MyBatis 的全局配置 settings 中有 一个参数 cacheEnabled,这个参数是二级缓存的全局开关,默认值是 true ,初始状态 为启用状态。 如果把这个参数设置为 false,即使有后面的二级缓存配置,也不会生效。 由于这个参数值默认为 true ,所以不必配置,如果想要配置,可以在 mybatis-config.xml 中添加如下代码。
<settings> <setting name=” cacheEnabled” value=” true” /> </settings>
MyBatis 的二级缓存是和命名空间绑定的,即二级缓存需要配置在 Mapper.xml 映射文件中 , 或者配置在 Mapper.java 接口中。在映射文件中 , 命名空间就是 XML 根节点 mapper 的 names pace 属性。 在 Mapper 接口中,命名空间就是接口 的全限定名称。

在保证二级缓存的全局配置开启的情况下,给 RoleMapper.xml 开启 二级缓存只需要在 UserMapper.xml 中添加<cache/>元素即可,添加后的 UserMapper.xml 如下。

<?xml version= ” 1. 0 ” encoding= ” UTF-8 ” ?〉
 < !DOCTYPE mapper PUBLIC ”-//mybatis . org//DTD Mapper 3 . 0//EN” ” http://mybatis . org/dtd/mybatis- 3-mapper.dtd” >
  <mapper namespace=” t k . mybatis . simple.mapper . RoleMapper”> <cache><!--配置><cache/> </mapper> 

默认的二级缓存会有如下效果。
• 映射语句文件中的所有 SELECT 语句将会被缓存。
• 映射语句文件中的所有 时SERT、 UPDATE、 DELETE 语句会刷新缓存。 缓存会使用 Least Recently Used (LRU,最近最少使用的)算法来收回。
• 根据时间表(如 no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新。 缓存会存储集合或对象(无论查询方法返回什么类型的值)的 1024 个引用。 • 缓存会被视为 read/write (可读/可写)的, 意味着对象检索不是共享的,而且可以安全 地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。 所有的这些属性都可以通过缓存元素的属性来修改,示例如下。

<cache 
eviction=” FIFO” flushlnterval=” 6000 0” 
size=” 512” readOnly=” true" />

这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新一次,存储集合或对象的 512 个引用 , 而且返回的对象被认为是只读的, 因此在不同线程中的调用者之间修改它们会导致冲 突。 cache 可以配置的属性如下。
eviction (收回策略)

LRU (最近最少使用的): 移除最长时间不被使用的对象,这是默认值。
FIFO (先进先出〉: 按对象进入缓存的顺序来移除它们。
};;> SOFT (软引用): 移除基于垃圾回收器状态和软引用规则的对象。
};;> WEAK (弱引用): 更积极地移除基于垃圾收集器状态和弱引用规则的对象。
第 7 章 MyBatis 锺存配置 I 183
flushinterval (刷新间隔〉。可以被设置为任意的正整数, 而且它们代表一个合理 的毫秒形式的时间段。 默认情况不设置,即没有刷新间隔, 缓存仅仅在调用语句时刷新。 size (引用数目)。 可以被设置为任意正整数,要记住缓存的对象数目和运行环境的可 用内存资源数目。默认值是 1024。 readOnly (只读)。属性可以被设置为 true 或 false。只读的缓存会给所有调用者 返回缓存对象的相同实例,因此这些对象不能被修改, 这提供了很重要的性能优势。 可 读写的缓存会通过序列化返回缓存对象的拷贝, 这种方式会慢一些,但是安全, 因此默 认是 false。