mybatis的缓存是在mapper文件中配置的
<cache type="com.***.mybatis.cache.MyCache"/>
框架默认提供了几种缓存类型:
- LRU:最近最少使用
- FIFO:先进先出
- SOFT:软引用
- WEAK:弱引用
以上方式,基本上都是使用JAVA的Deque,HashMap,SoftReference,WeakReference存储,因此存储是占用堆内存的。存储的数量不易过大。
另外mybatis为每个mapper(每个namespace)创建一个cache类。
如果你在一个mapper中关联查询了另外一张表,不可能通过关联表的操作来flush当前表的缓存。
另外你可以自定义缓存,采用分布式缓存,自定义cache如下:
id是当前mapper的namespace
public class MyCache implements Cache {
private String id;
private Map<String, Object> result = new HashMap<>();
public MyCache(String id){
this.id = id;
}
@Override
public String getId() {
return this.id;
}
@Override
public void putObject(Object o, Object o1) {
result.put(o.toString(), o1);
}
@Override
public Object getObject(Object o) {
return result.get(o.toString());
}
@Override
public Object removeObject(Object o) {
return result.remove(o.toString());
}
@Override
public void clear() {
result.clear();
}
@Override
public int getSize() {
return result.size();
}
@Override
public ReadWriteLock getReadWriteLock() {
return null;
}
}
每个更新操作,都带有flushCache,每个查询操作都带有useCache
<select id="getById" resultType="com.***.mybatis.entity.TestEntity" useCache="true">
-----
</select>
<update id="updateById" flushCache="true">
update TEST set name =#{name} where id=#{id}
</update>