Mybatis缓存
缓存:
⼀级缓存
SqlSession 的缓存 ------>⾃动开启
⼆级缓存:
做到从不同的缓存中共享数据
SqlSessionFactory 的缓存 —>需要⼿动开启
映射配置⽂件中配置
<mapper namespace="接⼝路径">
<cache eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
</mapper>
说明:
eviction: ⼆级缓存中,缓存的对象从缓存中移除的策略,回收策略为先进先出
flushInterval: 刷新缓存的事件间隔,单位:毫秒
size: 缓存对象的个数
readOnly: 是否是只读的
测试代码:
//不同qlSession,要同⼀个sqlSessionFactory
SqlSessionFactory factory= new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession sqlSession1=factory.openSession();
Student student = sqlSession1.selectOne("com.yhp.dao.StudentDao.findbystuid",
1);
System.out.println(student.getSname());
sqlSession1.close();
System.out.println("===================================");
SqlSession sqlSession2= factory.openSession();
student = sqlSession2.selectOne("com.yhp.dao.StudentDao.findbystuid", 1);
System.out.println(student.getSname());
sqlSession2.close();
cache元素⽤来开启当前mapper的namespace下的⼆级缓存,该元素的属性设置如下:
flushInterval:刷新间隔,可以被设置为任意的正整数,⽽且它们代表⼀个合理的毫秒形式的时间段, 默认情况下是不设置的,也就是没有刷新间隔,缓存仅仅调⽤语句时刷新。
size:缓存数⽬,可以被设置为任意正整数,要记住你的缓存对象数⽬和你运⾏环境可⽤内存资源数
⽬,默认值是1024.
readOnly:只读,属性可以被设置为true或false,只读的缓存会给所有调⽤者返回缓存对象的相同实
例,因此这些对象不能被修改。这提供了很重要的性能优势,可读写的缓存会返回缓存对象的拷⻉(通
过序列化),这会慢⼀些,但是安全,因此默认是false。
eviction:收回策略,默认为LRU,有如下⼏种:
LRU:最近最少使⽤的策略,移除最⻓时间不被使⽤的对象。
FIFO:先进先出策略,按对象进⼊缓存的顺序来移除它们。
SOFT:软引⽤策略,移除基于垃圾回收器状态和软引⽤规则的对象。
WEAK:弱引⽤策略,更积极地移除基于垃圾收集器状态和弱引⽤规则的对象。
注意:使⽤⼆级缓存时,与查询结果映射的java对象必须实现java.io.Serializable接⼝的序列化和反序列
化操作,如果存在⽗类,其成员都需要实现序列化接⼝,实现序列化接⼝是为了对缓存数据进⾏序列化
和反序列化操作,因为⼆级缓存数据存储介质多种多样,不⼀定在内存,有可能是硬盘或者远程服务
器。
Mybatis缓存原理
1.当我们第一次去查询的时候,数据就放入了一级缓存
2.第二次查询就走缓存
3.当SQLSession关闭时,SQLSession中的一级缓存就会往二级缓存提交