mybatis缓存-创新互联

目录

创新互联公司是一家专业提供裕华企业网站建设,专注与成都网站设计、成都做网站、H5场景定制、小程序制作等业务。10年已为裕华众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。

1、MyBatis的一级缓存

2、MyBatis的二级缓存

2.1二级缓存的相关配置

3.MyBatis缓存查询的顺序

4.整合第三方缓存EHCache


1、MyBatis的一级缓存 一级缓存(默认开启)是 SqlSession级别 的,通过同一个 SqlSession 查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问。 一级缓存 不用我们手动操作,而且我们是关闭不了的!!但是我们可以手动清除缓存。
sqlSession.clearCache();
使一级缓存失效的四种情况: 1) 不同的 SqlSession 对应不同的一级缓存 2) 同一个 SqlSession 但是查询条件不同 3) 同一个 SqlSession 两次查询期间执行了任何一次增删改操作 4) 同一个 SqlSession 两次查询期间手动清空了缓存
@Test
    public void testOneCache(){
        SqlSession sqlSession1 = SqlSessionUtils.getSqlSession();
        CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);
        Emp emp1 = mapper1.getEmpByEid(1);
        System.out.println(emp1);
        Emp emp2 = mapper1.getEmpByEid(1);
        System.out.println(emp2);
    }

查询同一个语句两次,第二次没有从数据库去查,直接输出缓存中的内容

SqlSession不同时就会分别从不同的SqlSession中查数据库

2、MyBatis的二级缓存 二级缓存是 SqlSessionFactory 级别,通过同一个 SqlSessionFactory 创建的 SqlSession 查询的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取 二级缓存开启的条件: a>在核心配置文件中,设置全局配置属性 cacheEnabled="true" ,默认为 true ,不需要设置 b>在映射文件中设置标签
c>二级缓存必须在 SqlSession 关闭或提交之后有效
sqlSession.close();
sqlSession.commit();
d>查询的数据所转换的实体类类型 必须实现序列化的接口

使二级缓存失效的情况: 两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效

二级缓存不能再用工具类SqlSessionUtils

public class SqlSessionUtils {

    public static SqlSession getSqlSession(){
        SqlSession sqlSession = null;
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            sqlSession = sqlSessionFactory.openSession(true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sqlSession;
    }

}

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

@Test
    public void testTwoCache(){
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
            CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);
            System.out.println(mapper1.getEmpByEid(1));
            sqlSession1.close();
            SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
            CacheMapper mapper2 = sqlSession2.getMapper(CacheMapper.class);
            System.out.println(mapper2.getEmpByEid(1));
            sqlSession2.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

缓存命中率(Cache Hit Ratio):就是看查询的数据在缓存中有没有。

2.1二级缓存的相关配置

在mapper配置文件中添加的cache标签可以设置一些属性:

  • eviction属性:缓存回收策略
LRU( Least Recently Used ) – 最近最少使用的:移除最长时间不被使用的对象。         FIFO( First in First out ) – 先进先出:按对象进入缓存的顺序来移除它们。         SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。         WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。默认的是 LRU。
  • flushInterval属性:刷新间隔,单位毫秒默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句(增删改)时刷新
  • size属性:引用数目,正整数 代表缓存最多可以存储多少个对象,太大容易导致内存溢出
  • readOnly属性:只读,true/false
true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。         false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是 false。 3.MyBatis缓存查询的顺序(先从大范围找再小范围)
  • 先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。
  • 如果二级缓存没有命中,再查询一级缓存
  • 如果一级缓存也没有命中,则查询数据库
  • SqlSession关闭之后,一级缓存中的数据会写入二级缓存 
4.整合第三方缓存EHCache

虽然是第三方缓存,但实现的功能与二级缓存相同

a>添加依赖
org.mybatis.cachesmybatis-ehcache1.2.1ch.qos.logbacklogback-classic1.2.3
b>各 jar 包功能
jar 包名称 作用
mybatis-ehcache Mybatis 和 EHCache 的整合包
ehcache EHCache 核心包
slf4j-api SLF4J 日志门面包
logback-classic 支持 SLF4J 门面接口的一个具体实现

c>创建EHCache的配置文件(resources文件夹下)ehcache.xml(必须叫这个名字)

d>设置二级缓存的类型 不加type使用的是二级缓存默认的
e>加入 logback 日志 存在 SLF4J 时,作为简易日志的 log4j 将失效,此时我们需要借助 SLF4J 的具体实现 logback 来打印日志。 创建 logback的配置文件(resources文件夹下)logback.xml
[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n   
f>EHCache 配置文件说明

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:mybatis缓存-创新互联
网页URL:http://pwwzsj.com/article/doghoc.html