1、缓存
MyBatis
的缓存分为一级缓存、二级缓存,用于缓存select
的结果
1.1、一级缓存
一级缓存是存放到了SqlSession
对象中
同一个SqlSession
的select
共享缓存
所以关闭SqlSession
时,缓存也就失效
执行insert
、update
、delete
、commit
等方法时,会自动清理一级缓存
在大多数情况下,每次查询都是不同的SqlSession
,所以一级缓存命中率并不高
public void firstLevel() {
try (SqlSession session = MyBatises.openSession()) {
Job job1 = session.selectOne("job.get", 1);
Job job2 = session.selectOne("job.get", 1);
System.out.println(job1 == job2);
}
}
上面的执行结果为true
,此时的session
对象没有被销毁,为同一个对象
1.2、二级缓存
1、为了提高缓存命中率,可以开启MyBatis
的二级缓存,namespace
(mapper
)级别的缓存
同一个namespace
下的select
共享缓存
默认情况,namespace
下insert
、update
、delete
执行成功时,会自动清理二级缓存。
当调用SqlSession
的close
方法时,会将查询结果放到二级缓存
2、开启二级缓存
在mybatis-config.xml
中配置
<setting name="cacheEnabled" value="true" />
在映射文件的mapper
(job.xml
)中添加cache
标签,默认会缓存映射文件中的所有select
的结果
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
size
:缓存有多少个存储结果(单个对象或一个列表)的引用,默认1024
eviction
:当缓存数量超过size
的清除策略。可选值有
-
LRU
:最近最少使用:移除最长时间不被使用的对象。 -
FIFO
:先进先出:基于垃圾回收器状态和软引用规则移除对象。 -
SOFT
:软引用:基于垃圾回收器状态和软引用规则移除对象。 -
WEAK
:弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
flushInterval
:每个多少毫秒清除一次缓存,默认不会定时清除缓存
readOnly
:true
代表缓存的是对原对象的引用,false
:代表缓存的是原对象序列化后的拷贝对象,所以false
时要实现Serializable
接口。默认是false
以下是 readOnly=false
的情况:
public void secondLevel2() {
SqlSession session1 = MyBatises.openSession();
Job job1 = session1.selectOne("job.get", 1);
job1.setName("aaaaaaaaa");
System.out.println(job1);
session1.close(); // 会被加入到二级缓存
job1.setName("bbbbbb"); // 不会被加入到缓存,因为没有调用close
SqlSession session2 = MyBatises.openSession();
Job job2 = session2.selectOne("job.get", 1);
System.out.println(job2);
}
3、延迟加载的全局开关
在mybatis-config.xml
中配置
<setting name="lazyLoadingEnabled" value="true"/>
true
:所有这只了select
属性的关联对象默认懒加载,可以通过fetchType
覆盖这个全局设置。
false
:所有设置了select
属性的关联对象默认立即加载,可以通过fetchType
覆盖这个全局设置
4、激进的延迟加载开关
在mybatis-config.xml
中配置
<setting name="aggressiveLazyLoading" value="true"/>
true
:当调用主对象的任意方法,都会触发立即加载关联对象
false
:只有当真正用到关联对象时,才会去加载关联对象
1.3、useCache、flushCache
可以通过设置useCache
属性来决定某个select
是否需要开启二级缓存
<select id="list" resultType="com.sj.bean.Job" useCache="false">
<include refid="sqlListAll"></include>
</select>
可以通过设置flushCache
属性来决定某个操作之后是否需要清除缓存
<select id="get" parameterType="int" resultType="com.sj.bean.Job" flushCache="false">
<include refid="sqlListAll" /> WHERE id = #{id}
</select>
网友评论