mybatis有一级缓存、二级缓存。
一级缓存,也叫本地缓存,默认开启,只作用于SqlSession有效区域。
二级缓存,多个SqlSession共享,相同接口、相同方法、相同参数的查询都可以共享查询结果。二级缓存默认是关闭的,可以使用在mapper文件中使用<cache>进行开启
自定义缓存
通过实现Cache接口,可以进行自定义缓存。
package com.zzw.cache;
import org.apache.ibatis.cache.Cache;
import java.util.HashMap;
import java.util.Map;
/**
* @program: javaweb-02-servlet
* @description:
* @author:
* @create: 2021-04-15 22:08
**/
public class MyCache implements Cache {
static Map<Object, Object> objetMap = new HashMap<>();
private final String id;
public MyCache(String str) {
this.id = str;
}
@Override
public String getId() {
System.out.println("MyCache.getId");
return id;
}
@Override
public void putObject(Object key, Object value) {
System.out.println("key = " + key + ", value = " + value);
objetMap.put(key, value);
}
@Override
public Object getObject(Object key) {
System.out.println("key = " + key);
return objetMap.get(key);
}
@Override
public Object removeObject(Object key) {
System.out.println("key = " + key);
return objetMap.remove(key);
}
@Override
public void clear() {
System.out.println("MyCache.clear");
objetMap.clear();
}
@Override
public int getSize() {
System.out.println("MyCache.getSize");
return objetMap.size();
}
}
使用自定义缓存/第三方缓存
<mapper namespace="com.zzw.mybatis.XmlPersonMapper">
<cache type="com.zzw.cache.MyCache"></cache>
</mapper>
缓存属性
- eviction=“FIFO”
缓存清理的规则:FIFO,先入先出;LRU:最近最少使用 - flushInterval=“60000”
刷新的间隔 - size=“512”
默认进行多少查询结果的缓存 - readOnly=“true”
缓存结果是否是只读的,如果是只读的,可以直接将缓存结果返回。如果不是,则需要进行缓存对象的拷贝
缓存使用规则
查询先去缓存中获取结果 三方缓存 -> 二级缓存 -> 一级缓存 -> 数据库
获取到结果后,将获取到的结果进行当前缓存级别的缓存。
增、删、改操作,则会将当前缓存进行更新