mybatis有两级缓存
一级缓存(默认), session缓存, 基于PerpetualCache 的 HashMap本地缓存,在session flush或者close的时候将消失
SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); //打开
..
..
..
sqlSession .close(); //关闭
二级缓存,同样也是基于PerpetualCache 的 HashMap本地缓存,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
<mapper namespace="me.gacl.mapping.userMapper">
<!-- 开启二级缓存 -->
<cache/>
image.png
如果实体类不实现可序列化接口,使用二级缓存,那么会报下列异常:
Exception in thread "main" org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException: Teacher................
所以在二级缓存的时候实体一定要是实现Serializable
public class Teacher implements Serializable
{
}