首先向介绍一下mybatis的缓存以及为什么使用缓存。
MyBatis缓存介绍
和hibernate等其他持久层框架一样,mybatis同样提供了一级缓存和二级缓存的支持,用于减轻数据压力,提高数据库性能。
一级缓存时SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
为什么要用缓存?
如果缓存中有数据就不用从数据库中获取,大大提高系统性能。
一、整合原因
首先ehcache是一个分布式缓存框架。当缓存的数据在各个服务单独存储,这样就不方便系统开发,系统为了提高系统并发,性能,所以要使用分布式缓存对缓存数据进行集中管理。而mybatis无法实现分布式缓存,需要和其他分布式缓存框架进行整合。
二、整合原理
mybatis提供二级缓存Cache接口,如下:
它的默认实现类:
通过实现Cahce接口可以实现mybatis缓存数据通过其它缓存数据库整合,mybatis的特长是sql操作,缓存数据的管理不是myabatis的特长,为了提高缓存的性能将mybatis和第三发的缓存数据库整合。
三、整合方法
1、引入缓存需要的jar包
2、引入缓存配置文件
在classpath下配置ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="F:\develop\ehcache" />
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
3、开启ehcache缓存
配置mapper中的cache中的type为ehcache对cache接口的实现类型
修改mapper.xml文件,在cache中指定EhcacheCache。
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
四、应用场景
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。
五、局限性
mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。
本文介绍了MyBatis的一级和二级缓存概念,并详细阐述了为何以及如何整合Ehcache来实现分布式缓存。通过引入缓存jar包,配置缓存文件,以及开启Ehcache,可以提升系统的并发性能和数据库效率。然而,二级缓存存在局限性,如无法细粒度控制数据更新,对此需在业务层进行针对性缓存处理。

584

被折叠的 条评论
为什么被折叠?



