EhCache 是一个纯Java的进程内缓存框架,是一种被广泛使用的开源Java分布式的缓存框架,具有快速、精干等特点,是Hibernate中默认的缓存提供者。不使用分布缓存,缓存的数据就会在各个服务器上单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。分布式缓存示意图如下:
情景:负载均衡+服务器集群(发布相同的Web应用)
用户第一次登陆,负载均衡将请求发到计算机A处理,信息放在session中。下一次用户再次访问时,请求可能计算机B,这时用户就要重新登陆???
解决这一问题:专门一台缓存机器,使用分布式缓存框架radis、echache、memcached进行管理。
>Mybatis整合echache原理
mybatis提供二级缓存Cache接口,如下所示:
mybatis针对此接口提供了一个默认的实现类,如下所示:
虽然mybatis也实现提供了二级缓存,但是mybatis的特长是SQL操作,而不是缓存管理,比如实现分布式缓存,mybatis就不支持此功能。为了提高缓存的性能将mybatis与第三方的缓存数据库框架整合即可,如ehcache、redis、memcache等。
通过上图可以看出只要实现了mybatis的cache接口就可以实现mybatis的二级缓存数据。
>Mybatis整合echache 三部曲
办公高级应用教程、1、引入缓存的依赖包
2、在classpath下添加ehcache.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"updateCheck="false"><diskStore path="F:/temp" /><defaultCache maxElementsInMemory="20000" eternal="false"timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"maxElementsOnDisk="10000000" diskPersistent="false"diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /><cache name="eternalCache" maxElementsInMemory="20000" eternal="true"overflowToDisk="true" diskPersistent="false" timeToLiveSeconds="0"diskExpiryThreadIntervalSeconds="120" />
</ehcache>
属性说明:
diskStore:指定数据在磁盘中的存储位置。
defaultCache:当借助CacheManager.add("demoCache")创建Cache时,EhCache便会采用<defalutCache/>指定的管理策略
以下属性是必须的:
maxElementsInMemory - 在内存中缓存的element的最大数目
maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据,timeToLiveSeconds判断
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
以下属性是可选的:
timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.
diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
3、开启ehcache缓存
在mapper.xml中开启二级缓存是通过添加cache元素,cache元素提供了一个type属性,此属性指定一个实现了mybatis的Cache接口的实现类。对于ehcache缓存框架,它提供了一个mybatis的Cache接口的实现类,只需要指向此类即可。
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
同样也可根据需求调整缓存参数:
<cache type="org.mybatis.caches.ehcache.EhcacheCache" > <property name="timeToIdleSeconds" value="3600"/><property name="timeToLiveSeconds" value="3600"/><!-- 同ehcache参数maxElementsInMemory --><property name="maxEntriesLocalHeap" value="1000"/><!-- 同ehcache参数maxElementsOnDisk --><property name="maxEntriesLocalDisk" value="10000000"/><property name="memoryStoreEvictionPolicy" value="LRU"/></cache>
测试程序:
@Testpublic void queryUserMapper() throws Exception{Integer userId=1;SqlSession session1=factory.openSession();UserMapper mapper1=session1.getMapper(UserMapper.class);User user1 = mapper1.queryUserById(userId);System.out.println(user1);session1.close();SqlSession session2=factory.openSession();UserMapper mapper2=session2.getMapper(UserMapper.class);User user2 = mapper2.queryUserById(userId);System.out.println(user2);session2.close();}
Debug日志:同样实现了二级缓存功能;
DEBUG [main] - ==> Preparing: select * from user where user_id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
User [userId=1, userName=zhangsan, password=123456, roleCode=plain, cname=张三, telphone=17864195335, address=山东济南, isLogin=0]
DEBUG [main] - put added 0 on heap
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@44c03695]
DEBUG [main] - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@44c03695]
DEBUG [main] - Returned connection 1153447573 to pool.
DEBUG [main] - Cache Hit Ratio [com.langsin.mapper.UserMapper]: 0.5
User [userId=1, userName=zhangsan, password=123456, roleCode=plain, cname=张三, telphone=17864195335, address=山东济南, isLogin=0]
本地出现缓存文件:
整合工作开展计划?>二级缓存应用场景j及局限性
1、应用场景
对于访问次数较多的查询请求并且用户对查询的实时性要求不高,此时可以采用mybatis二级缓存技术降低数据库的访问量,提高访问速度。比如:耗时较高的统计分析SQL,电话账单查询SQL等。
实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟等,根据需求设置。
2、局限性
mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态