使用mybatis自带的二级缓存
- 同一个sqlSession会共享一级缓存
- 二级缓存 同一个namespace产生的xxxMapper对象 默认是关闭状态的 实际存放在硬盘中
- 序列化 内存->硬盘
- 反序列化 硬盘—> 内存
- 准备缓存的对象必须实现序列化接口(如果开启的缓存),将可知对象进行序列化。实现Serializable接口(序列化一个类需要将他的级联属性和父类也要进行序列化)
- 当执行close的时候会将一级的缓存对象放到二级缓存对象中去
- 禁用:select标签中useCache="false"
- 命中率为:查询到的次数/总次数
- 清理缓存:commit(执行增删改,设计的原因是为了防止脏数据) 或者 添加属性 flushCaChe="true"
使用第三方二级缓存
以 实现EhcacheCache为例子
配置xml文件 方法:
-
<?xml version="1.0" encoding="UTF-8"?> <ehcache> <!-- 当超过内存限的时候(缓存对象的个数>maxElementsInMemory)、指定路径放二级缓存 --> <diskStore path="D:\Ehcache"/> <!-- 设定缓存的默认数据过期策略 --> <!-- maxElementsInMemory在内存缓存的个数 maxEntriesLocalDisk在硬盘中放的最大个数 eternal:设置缓存永远会不会过期 overflowToDisk:当内存缓存的对象个数满了是不是往硬盘中转移 timeToIdleSeconds:当两次访问 超过该值的时候就会将缓存对象失效 timeToLiveSeconds:一个缓存对象最多的存放时间 diskExpiryThreadIntervalSeconds:设置每隔一段时间清理硬盘的缓存 memoryStoreEvictionPolicy:当超过缓存对象的最大值的时候进行处理的策略 LRU处理掉最后一个 FIFO先进先出 LFU最不常使用的删了。 --> <defaultCache maxElementsInMemory="10000" eternal="false" overflowToDisk="true" timeToIdleSeconds="10" timeToLiveSeconds="20" diskPersistent="false" diskSpoolBufferSizeMB="30" maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> </defaultCache> </ehcache>
- 在mapper的xml文件中声明接口
<!--实现EhcacheCache的接口-->
<cache type="org.mybatis.caches.ehcache.EhcacheCache">
<!--覆盖xml中配置的值-->
<property name="maxElementsInMemory" value="10000" />
</cache>