mybatis的缓存2: 二级缓存

目录

0. 概念, 介绍

1. mapper映射文件

2. POJO实体类

3. 测试类

4. 二级缓存配置

 5. mybatis缓存查询顺序

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关闭后,一级缓存中的数据会写入二级缓存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值