目录
0. 概念, 介绍
二级缓存是SqlsessionFactory级别, 通过一个sqlsessionfactory创建的sqlsession查询结果会被缓存, 下次查询相同的数据, 就会从缓存中直接获取,不会从数据库直接访问。
二级缓存开启的条件:
1. 在核心配置文件中, 设置全局变量属性cacheEnabled = "true", 默认为true, 不需要设置。
2. 在mapper映射文件中设置标签 <cache/>
3. 二级缓存必须在sqlsession关闭或提交之后有效
二级缓存失效的条件:
两次查询直接进行了任意的增删改。
1. mapper映射文件
需要加入<cache/>标志
<!-- 开启二级缓存标志-->
<cache/>
2. POJO实体类
需要实现序列化类。
public class Emp implements Serializable {
3. 测试类
不能调用自己写的工具类sqlsessionUtils, 因为二级缓存是针对sqlsessionFactory级别。
public void testTwoCache(){
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession1 = build.openSession(true);
CacheMapper mapper = sqlSession1.getMapper(CacheMapper.class);
System.out.println(mapper.getEmpByEid(1));
sqlSession1.close();
SqlSession sqlSession2 = build.openSession(true);
CacheMapper mapper1 = sqlSession2.getMapper(CacheMapper.class);
System.out.println(mapper1.getEmpByEid(1));
} catch (IOException e) {
e.printStackTrace();
}
}
Cache Hit Ratio [com.mybatis.mapper.CacheMapper]: 0.5 (这里我们可以看到原来是0,现在是0.5)查询命中率,说明缓存中已经存在。
10:35:45:371 [main] DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger 137 - ==> Preparing: select * from t_emp where eid=? 10:35:45:534 [main] DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger 137 - ==> Parameters: 1(Integer) 10:35:45:604 [main] DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger 137 - <== Total: 1 Emp{eid=1, empName='张三', age=32, sex='男', email='123@qq.com', dept=null} 10:35:45:623 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction 91 - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@72cde7cc] 10:35:45:625 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource 391 - Returned connection 1926096844 to pool. 10:35:45:630 [main] WARN org.apache.ibatis.io.SerialFilterChecker 46 - As you are using functionality that deserializes object streams, it is recommended to define the JEP-290 serial filter. Please refer to https://docs.oracle.com/pls/topic/lookup?ctx=javase15&id=GUID-8296D8E8-2B93-4B9A-856E-0A65AF9B8C66 10:35:45:635 [main] DEBUG org.apache.ibatis.cache.decorators.LoggingCache 60 - Cache Hit Ratio [com.mybatis.mapper.CacheMapper]: 0.5 Emp{eid=1, empName='张三', age=32, sex='男', email='123@qq.com', dept=null}
4. 二级缓存配置
二级缓存配置参数介绍:
eviction: 缓存回收策略。
LRU(Latest Recently Used) : 移除最长时间不被用的对象。- 默认
FIFO(First in First out): 先进先出,按对象进入缓存的顺序来移走他们。
SOFT: 软应用, 移除基于垃圾回收器状态和软引用对象的规则。
flushInterval: 刷新间隔,单位毫秒。默认情况:不设置, 也就是没有刷新间隔,缓存仅仅调 用语句时刷新。
size: 引用条目, 正整数。代表缓存可以最多缓存多少个对象, 太大容易导致内存溢出。
readonly: 只读, true/false. true: 只读缓存, 会给调用者返回缓存的相同实例, 因为这些对 象不能被修改,所以提供了很强的优势。false: 读写缓存, 会返回缓存的拷贝 (通过序列化, 这会慢一些,但安全性更高。)
5. mybatis缓存查询顺序
先查询二级缓存,因为二级缓存中可能会有其他程序已经查询出来的数据, 可以拿来直接使用。
如果二级缓存没有命中, 再查询一级缓存。
如果一级缓存没有命中,在查询数据库。
sqlsession关闭后,一级缓存中的数据会写入二级缓存。