MyBatis的缓存包括系统缓存和自定义缓存,而系统缓存又包括一级缓存和二级缓存。
MyBatis系统缓存:
MyBatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存。
- 一级缓存只是相对于同一个SqlSession而言:
我们发现第一个SqlSession实际只发生过一次查询,而第二次查询就从缓存中取出了,也就是SqlSession层面的一级缓存,它在各个SqlSession是相互隔离的。
2. 二级缓存是在SqlSessionFactory层面上,默认情况下是不开启的。二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的,也就是要求实现Serializable接口,配置的方法很简单,只需要映射XML文件配置就可以开启缓存.
<cache/>
例子:
<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>
eviction: 代表的是缓存回收策略,目前MyBatis提供以下策略。
LRU,(Least Recently Used)最近最少使用的,移除最长时间不用的对象。
FIFO,先进先出,按对象进入缓存的顺序来移除它们。
SOFT,软引用,移除基于垃圾回收器状态和软引用规则的对象。
WEAK,弱引用,更积极地移除基于垃圾收集器状态和若引用规则的对象。
flushInterval: 刷新间隔时间,单位为毫秒,这里配置的是100秒刷新,如果不不配置它,那么当SQL被执行的时候才会去刷新缓存。
size: 引用数目,一个正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。这里配置的是1024个对象。
readOnly: 只读,意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是我们没有办法修改缓存,它的默认值为false,不允许我们修改。
自定义缓存:
系统缓存是MyBatis应用机器上的本地缓存,但是在大型服务器上,会使用各类不同的缓存服务器,这个时候我们可以定制缓存。要实现定制缓存我们要实现MyBatis提供的如下接口
org.apache.ibatis.cache.Cache
@Override
public void clear() {
// TODO Auto-generated method stub
}
@Override
public String getId() {
// TODO Auto-generated method stub
return null;
}
@Override
public Object getObject(Object arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public ReadWriteLock getReadWriteLock() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void putObject(Object arg0, Object arg1) {
// TODO Auto-generated method stub
}
@Override
public Object removeObject(Object arg0) {
// TODO Auto-generated method stub
return null;
}
配置自定义缓存:
<cache type="com.learn.chapter1.cache.MyCache">