简介
1.什么是缓存
将一次查询的结果暂时存储到一个可以直接取的地方。
2.原因:
- 多次连接数据库查询,浪费资源(减少系统开销,提高效率)
- 解决高并发的问题
3.什么样的数据适合缓存:
经常查询,不经常更改的数据
Mybatis缓存
1.Mybatis包含一个非常强大的查询缓存特性,可以非常方便的定制和配置缓存,缓存可以极大的提高查询效率
2.执行select时使用缓存,一旦执行了update,insert,delete语句缓存刷新(会改变原来的数据)
3.sqlsession.clearCache();
4.Mybatis中定义了,两种缓存等级:
- 一级缓存(自动开启):SqlSession的开启与SqlSession.close这个期间有效,为一级缓存
(缓存的生命周期)示例:没有关闭SQLSession只进行了一次查询
关闭了SQLSession之后,进行了两次查询 - 二级缓存(需要手动开启):
也叫全局缓存,由于一级缓存作用域过低一个,所以诞生了二级缓存
基于namespace级别的缓存,一个命名空间中有效(例如:UserMapper.class中有效)
工作机制:
一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
若当前会话关闭,一级缓存消失,(希望的是:一级缓存消失,数据存储到二级缓存中)
新的会话查询信息直接从二级缓存中获取
不存的namespace会有自己的缓存空间
1.开启配置(开启全局缓存)
mybatis-config.xml
UserMapper.xml<setting name="cacheEnabled" value="true"/>
2.配置缓存设置
注意:启用二级缓存时需要开启对象序列化(将实体类序列化)<!--FIFO:先进先出的缓存规则 60000:60秒刷新 --> <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />
错误信息:org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException: com.test.pojo.UserPojo