一、Ehcache缓存机制
Ehcache属于二级缓存。缓存的粒度是单个实体类,也就是说当更新,修改,删除时,会将整个实体表中的数据在缓存中清空。这也是Ehcache的局限性。接下来说下Ehcache缓存策略,比如查询商品表,商品表加上了Ehcache
1. select * from 商品表。首先会去一级缓存查询,其次到二级缓存,最后才会到数据库查询实体记录。
2. 将获取到所有商品对象的ID集合存入二级缓存中
3. 当根据ID查询时,步骤与第一步类似
4. 更新、修改、删除会将缓存中的数据清空,重新加载商品表。
二、Ehcache作用
因为Ehcache会将数据放到内存中,而内存中读取的效率比硬盘快。所以增加了数据读取的效率。其次Ehcache是轻量级的,内部仅仅依赖了slf4j。且配置简单,学习成本较低。Ehcache可以弥补mybaits自带的cache的不足。
三、Ehcache与mybaits结合
1)首先是加入依赖包mybatis-ehcache
<!--ehcache 缓存-->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.1.0</version>
</dependency>
2)配置ehcache.xml
默认会在classpath路径下加载ehcache.xml。所以我们创建一个ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache >
<!--
maxElementsInMemory:缓存中最大允许创建的对象数
maxInMemory:设定内存中创建对象的最大值。
eternal:设置元素(译注:内存中对象)是否永久驻留。如果是,将忽略超时限制且元素永不消亡。
timeToIdleSeconds:设置某个元素消亡前的停顿时间。仅当eternal为false时起效
timeToLiveSeconds:为元素设置消亡前的生存时间.仅当eternal为false时起效.默认为0,即存活时间无限大
overflowToDisk:设置当内存中缓存达到 maxInMemory 限制时元素是否可写到磁盘上。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
diskPersistent:重启时内存不持久化到硬盘。默认为false
diskExpiryThreadIntervalSeconds:磁盘中清理线程运行间隔
-->
<diskStore path="D:/cache"/><!-- 缓存存放目录(此目录为放入系统默认缓存目录),也可以是”D:/cache“ java.io.tmpdir -->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="140"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<cache name="cacheTest"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="140"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</cache>
</ehcache>
3)mybaits配置打开缓存
<configuration>
<!--配置全局属性-->
<settings>
····
<!--开启缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
4)实体mapper配置
<!--
LoggingEhcache 过时了
Not needed with MyBatis 3.2.x
<cache type="org.mybatis.caches.ehcache.LoggingEhcache" />
与EhcacheCache区别在于是否打印日志
-->
<cache type="org.mybatis.caches.ehcache.EhcacheCache" />
四、总结
Ehcache虽然可以增加访问数据的速度,但也有他一定的局限性。比如上面所讲到的,对于细粒度的数据来说,可维护性不是很好。比如缓存商品信息,由于商品信息访问量大,所以需要将商品信息进行缓存,此时如果用Ehcache缓存,就无法实现当一个商品变化时,只刷新该商品的缓存信息而不刷新其他商品。因为ehcache的单位为单个mapper。即刷新一个商品信息时,会将所有商品信息从缓冲中清空,重新赋值。