什么是EhCache 缓存

EhCache 缓存-提高检索效率的利器

缓存-官方文档

文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache

EhCache 缓存

配置文档: https://www.cnblogs.com/zqyanywn/p/10861103.html

基本介绍

  1. EhCache 是一个纯Java 的缓存框架,具有快速、精干等特点。
  2. MyBatis 有自己默认的二级缓存(前面我们已经使用过了),但是在实际项目中,往往使用的是更加专业的第三方缓存产品作为MyBatis 的二级缓存,EhCache 就是非常优秀的缓存产品。

什么是EhCache 缓存_第1张图片

配置和使用EhCache

  1. 加入相关依赖, 修改pom.xml
<dependencies>
        
        <dependency>
            <groupId>net.sf.ehcachegroupId>
            <artifactId>ehcache-coreartifactId>
            <version>2.6.11version>
        dependency>
        
        <dependency>
            <groupId>org.slf4jgroupId>
            <artifactId>slf4j-apiartifactId>
            <version>1.7.25version>
        dependency>
        
        <dependency>
            <groupId>org.mybatis.cachesgroupId>
            <artifactId>mybatis-ehcacheartifactId>
            <version>1.2.1version>
        dependency>
 dependencies>
  1. mybatis-config.xml 仍然打开二级缓存
<settings>

<setting name="cacheEnabled" value="true"/>
settings>
  1. 加入src\main\resources\ehcache.xml 配置文件
    文档说明: https://www.taobye.com/f/view-11-23.html

<ehcache>
    
    <diskStore path="java.io.tmpdir/Tmp_EhCache"/>
    
    
    <defaultCache
            eternal="false"
            maxElementsInMemory="10000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="259200"
            memoryStoreEvictionPolicy="LRU"/>

ehcache>
  1. 在XxxMapper.xml 映射文件启用EhCache , 当然原来MyBatis 自带的缓存配置就注销了

        
        <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    
  2. 修改MonsterMapperTest.java , 增加测试方法, 完成测试。
    测试ehCache缓存使用效果

        @Test
        public void ehCacheTest() {
    
            //查询id=3的monster
            Monster monster = monsterMapper.getMonsterById(3);
            //会发出SQL, 到db查询
            System.out.println("monster=" + monster);
    
            //这里关闭sqlSession, 一级缓存[数据]失效.=> 将数据放入到二级缓存 (ehcache)
            if (sqlSession != null) {
                sqlSession.close();
            }
    
            //重新获取sqlSession
            sqlSession = MyBatisUtils.getSqlSession();
            //重新获取了monsterMapper
            monsterMapper = sqlSession.getMapper(MonsterMapper.class);
            //再次查询id=3的monster
            System.out.println("--虽然前面关闭了sqlSession,因为配置二级缓存(ehcache), " +
                    "当你再次查询相同的id时, 不会再发出sql, 而是从二级缓存(ehcache)获取数据----");
            Monster monster2 = monsterMapper.getMonsterById(3);
            System.out.println("monster2=" + monster2);
    
            //再次查询id=3的monster, 仍然到二级缓存(ehcache), 获取数据, 不会发出sql
            Monster monster3 = monsterMapper.getMonsterById(3);
            System.out.println("monster3=" + monster3);
    
            if (sqlSession != null) {
                sqlSession.close();
            }
    
        }
    

EhCache 缓存-细节说明

如何理解EhCache 和MyBatis 缓存的关系

  1. MyBatis 提供了一个接口Cache【如下图,找到org.apache.ibatis.cache.Cache ,关联源码包就可以看到Cache 接口】。

什么是EhCache 缓存_第2张图片

  1. 只要实现了该Cache 接口,就可以作为二级缓存产品和MyBatis 整合使用,Ehcache 就是实现了该接口。

  2. MyBatis 默认情况(即一级缓存)是使用的PerpetualCache 类实现Cache 接口的,是核心类。

  3. 当我们使用了Ehcahce 后,就是EhcacheCache 类实现Cache 接口的,是核心类。

什么是EhCache 缓存_第3张图片
5. 我们看一下源码,发现缓存的本质就是Map
什么是EhCache 缓存_第4张图片

你可能感兴趣的:(MyBatis,缓存,java,mybatis)