mybatis 缓存
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。