MyBatis整合Ehcache第三方缓存

学习地址:http://www.mybatis.org/ehcache-cache/

第一步:下载ehcache

下载地址:https://github.com/mybatis/ehcache-cache/releases

第二步:将相关依赖包导入到lib文件夹中,并加入依赖

在这里插入图片描述

MyBatis整合Ehcache第三方缓存_第1张图片

第三步:Ehcache依赖 slfj 日志框架,必须要导入slfj的两个jar包

在这里插入图片描述

MyBatis整合Ehcache第三方缓存_第2张图片

第四步:修改mybatis-config.xml配置文件

MyBatis开启二级缓存新版本已经默认支持开启二级缓存.可以不改
<settings>
	<!-- 开启二级缓存 -->
	<setting name="cacheEnabled" value="true"/>
</settings>

全局缓存策略

<!--配置二级缓存提供商实现类,使用的是默认全局缓存策略-->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

全局缓存策略就是所有的Mapper文件都是使用该缓存策略。

第六步:在xxxMapper.xml配置

<!--配置二级缓存提供商实现类,使用的是默认全局缓存策略-->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

第七步:在classpath(src)创建 ehcache.xml配置文件

<ehcache>
    <!-- 缓存的磁盘位置(数据存在内存不够时,存在磁盘中) -->
    <diskStore path="D:/mybatis_cache"/>
    <!-- 默认的缓存策略: 如果开发者在某一个需要缓存的文件配置了自定义缓存,就不使用默认的,如果没有配置,就使用默认缓存策略
        maxElementsInMemory  在内存最多缓存多少个对象
        eternal            是否永久有效
        timeToIdleSeconds   最大空闲时间,单位:秒
        timeToLiveSeconds   最大在线时间,单位:秒
        overflowToDisk      超出内存是否保存在磁盘
    -->
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
    />
</ehcache>


第八步:实体类序列化

因为二级缓存可以缓存到文件(将对象序列化到本地),涉及到对象序列化,那么对应的javaBean对象就必须实现
public class User implements Serializable{
	private static final long serialVersionUID = -8366151150155170110L;
}

局部缓存策略

第六步:在映射文件中配置以及配置对应的缓存策略

<mapper namespace="cn.zj.mybatis.dao.UserMapper">
	
	<!-- 当前表的映射开启支持二级缓存,并设置相关的缓存提供商,以及缓存的相关配置 -->
	<cache type="org.mybatis.caches.ehcache.EhcacheCache" >
       <!--最大的空闲时间  -->
       <property name="timeToIdleSeconds" value="10000"/>
       <!-- 最大的在线时间 -->
       <property name="timeToLiveSeconds" value="20000"/>
       <!-- 内存的大小 b字节 m1 =1024k 1k=1024b -->
       <property name="maxEntriesLocalHeap" value="2000000"/>
       <!-- 文件的大小 b字节-->
       <property name="maxEntriesLocalDisk" value="20000000"/>
       <!-- 算法 LRU:最少使用优先, "LFU" or "FIFO:先进先出 -->
       <property name="memoryStoreEvictionPolicy" value="LRU"/>
    </cache> 
	<select id="selectAll" resultType="User">
		select * from user
	</select>
</mapper>

第七步:实体类序列化

因为二级缓存可以缓存到文件(将对象序列化到本地),涉及到对象序列化,那么对应的javaBean对象就必须实现
public class User implements Serializable{
	private static final long serialVersionUID = -8366151150155170110L;
}

第九步:测试代码

	@Test
	public void testSelectByPrimaryKey() {
		for (int i = 0; i < 1000; i++) {
			// 1.创建SqlSession操作对象
			SqlSession openSession = MyBatisUtil.openSession();
			// 2.创建UserMapper接口的代理对象
			UserMapper mapper = openSession.getMapper(UserMapper.class);
			User user2 = mapper.selectByPrimaryKey(3);
			System.out.println("用户:"+user2);
			// 4.关闭session
			openSession.close();
		}
	}

缓存的命中率

命中率= 从缓存中获取数据的次数/ 查询的总次数
如 : 两次查询 从缓中获取一次
0.5 = 1/2;
0.666666 = 2/3;
命中率越高缓存效果越好

DEBUG [main] - Cache Hit Ratio [cn.zj.mybatis.mapper.UserMapper]: 0.0
DEBUG [main] - ==> Preparing: select * from user where id = ?
DEBUG [main] - > Parameters: 3(Integer)
DEBUG [main] - <
Total: 1
DEBUG [main] - Cache Hit Ratio [cn.zj.mybatis.mapper.UserMapper]: 0.5
DEBUG [main] - Cache Hit Ratio [cn.zj.mybatis.mapper.UserMapper]: 0.6666666666666666
DEBUG [main] - Cache Hit Ratio [cn.zj.mybatis.mapper.UserMapper]: 0.75
DEBUG [main] - Cache Hit Ratio [cn.zj.mybatis.mapper.UserMapper]: 0.8
DEBUG [main] - Cache Hit Ratio [cn.zj.mybatis.mapper.UserMapper]: 0.8333333333333334
DEBUG [main] - Cache Hit Ratio [cn.zj.mybatis.mapper.UserMapper]: 0.8571428571428571
DEBUG [main] - Cache Hit Ratio [cn.zj.mybatis.mapper.UserMapper]: 0.875
DEBUG [main] - Cache Hit Ratio [cn.zj.mybatis.mapper.UserMapper]: 0.8888888888888888
DEBUG [main] - Cache Hit Ratio [cn.zj.mybatis.mapper.UserMapper]: 0.9

你可能感兴趣的:(mybatis)