栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis的缓存2: 二级缓存

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis的缓存2: 二级缓存

目录

0. 概念, 介绍

1. mapper映射文件

2. POJO实体类

3. 测试类

4. 二级缓存配置

 5. mybatis缓存查询顺序

0. 概念, 介绍

二级缓存是SqlsessionFactory级别, 通过一个sqlsessionfactory创建的sqlsession查询结果会被缓存, 下次查询相同的数据, 就会从缓存中直接获取,不会从数据库直接访问。

二级缓存开启的条件:

1. 在核心配置文件中, 设置全局变量属性cacheEnabled = "true", 默认为true, 不需要设置。

2. 在mapper映射文件中设置标签

3. 二级缓存必须在sqlsession关闭或提交之后有效

二级缓存失效的条件:

两次查询直接进行了任意的增删改。

1. mapper映射文件

需要加入标志

 
    

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/924360.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号