使用EHcache完成二级缓存
想要简单的实现一个二级缓存的基本操作,可以自己定义一个类,里面有一个Map类型的static属性map,每一次查询数据库之前,先在map中去查看是否已经存在(需要简单设计一下key的规则,防止重复,例如:可以使用库名_表名_ID)该记录,如果有,直接返回数据,如果没有则去数据库中查询,并将查询结果放入到map中,以便下次使用。
此处,我们可以使用Ehcache第三方库来实现简单的二级缓存,项目中一般使用redis作为缓存第三方库。
步骤如下:
-
导入包:
org.mybatis.caches
mybatis-ehcache
1.1.0
-
添加配置 ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 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:内存数量最大时是否清除。 --> <!-- 默认cache:如果没有对应的特定区域的缓存,就使用默认缓存 --> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="false"/> <!-- 指定区域cache:通过name指定,name对应到Hibernate中的区域名即可--> <!--cache name="com.wl.test.model.Student" eternal="false" maxElementsInMemory="100" timeToIdleSeconds="1200" timeToLiveSeconds="1200" overflowToDisk="false"> </cache--> </ehcache>
-
在mapper中添加配置或者在dao中添加注解
BookTypeMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
SELECT id, name FROM book_type WHERE id = #{id}
如果是使用注解的方式,那么就在BookTypeDAO.java中加入对应注解。
@Repository
@MapperScan
@CacheNamespace(implementation = org.mybatis.caches.ehcache.EhcacheCache.class)
public interface BookTypeDAO {
BookType findById(Integer id);
}