上一篇:22-Mybatis缓存相关设置对一级缓存和二级缓存的影响https://blog.csdn.net/fsjwin/article/details/109685932
mybatis本身有缓存的实现,但是可以集成更专业的缓存框架比如:EHCache。
1. Mybatis的缓存接口
-
org.apache.ibatis.cache.Cache 为mybatis的缓存接口。
-
加入依赖后的:
2. Mybatis集成EHCache步骤
2.1 导入依赖
参考整合官网:http://mybatis.org/ehcache-cache/
<!--ehcache-->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.2.1</version>
</dependency>
2.2 配置文件ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="D:\tmp\ehcache"/>
<!--
name:缓存名称。
maxElementsInMemory:缓存最大个数。
eternal:对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk:硬盘最大缓存个数。
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush:内存数量最大时是否清除。
-->
<defaultCache
maxElementsInMemory="10000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
2.3 配置使用EHCache StudentDao.xml
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
2.4 测试
- 测试
@Test
public void test26() {
SqlSession sqlsession = MybatisUtil.getSqlsession();
SqlSession sqlsession2 = MybatisUtil.getSqlsession();
StudentDao studentDao = sqlsession.getMapper(StudentDao.class);
StudentDao studentDao2 = sqlsession2.getMapper(StudentDao.class);
//可以吧查询的条件放进去,也可以使用一个单独的类ParaObject类封装就可以了。
List<StudentVo> studentList = studentDao.selectStudentResultType(1001);
System.out.println("清理缓存");
sqlsession.clearCache();
sqlsession.close();//必须关掉,才会进入二级缓存中。
List<StudentVo> studentList2 = studentDao2.selectStudentResultType(1001);
}
- 确认使用了ehcache
- 本地缓存文件:
- 测试结果
PooledDataSource forcefully closed/removed all connections.
Cache Hit Ratio [com.yuhl.dao.StudentDao]: 0.0
Opening JDBC Connection
Created connection 471579726.
==> Preparing: select id,name,email,age from student where id=?
==> Parameters: 1001(Integer)
<== Columns: id, name, email, age
<== Row: 1001, 张三, zhangsan@qq.com, 20
<== Total: 1
清理缓存
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1c1bbc4e]
Returned connection 471579726 to pool.
Cache Hit Ratio [com.yuhl.dao.StudentDao]: 0.5
2.5 多个namespace使用EHCache
UserDao.xml 配置缓存饮用即可,只需要在一个地方配置,其他地方使用即可:
UserDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuhl.dao.UserDao">
<!--引用其他地方的缓存配置-->
<cache-ref namespace="com.yuhl.dao.StudentDao"/>
<!-- <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>-->
</mapper>
3.总结
下一篇:01-Springboot优点&缺点https://blog.csdn.net/fsjwin/article/details/109698409