SSM之MyBatis_03_02_mybatis整合ehcache缓存、什么叫分布式、二级缓存应用场景、局限性

系列文章目录

mybatis整合ehcache缓存

前言

我们在使用hibernate的时候,可以知道,hibernate就是使用ehcache来实现二级缓存的
为什么我们要用ehcache来实现缓存而不用mybatis自带的perpetualCache
因为
Mybatis本身是一个持久层框架,它不是专门的缓存框架,所以它对缓存的实现不够好,不能支持分布式

Ehcache是一个分布式的缓存框架
即mybatis的主要精力使用在保存数据和查询数据这一块,缓存不是它的重点
每件事物都不是完美的,一定有它的侧重点、一定有它优点和缺点
mybatis自带的ehcache就不支持分布式

什么是分布式

系统为了提高性能,通常会对系统采用分布式部署(集群部署方式)
在这里插入图片描述
理解:即有很多的服务器,每个服务器跑着同样的项目(一般访问同一个数据库(简单一些),也可以访问不同的数据库(更复杂))
这就是集群,也就是分布式
就像腾讯,在全国各地都有很多的服务器
像上图中这样的两台服务器,它们的缓存就可以用ehcache来实现
(redis的功能也是一个进行集群的缓存)

mybatis整合ehcache缓存

Cache是一个接口,有很多第三方厂商去实现这个接口,这样Cache才比较规范,否则就乱套了
它的默认实现是mybatis的PerpetualCache。如果想整合mybatis的二级缓存,那么实现Cache接口即可

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这是mybatis自己实现的缓存
但是前面我们说了,mybatis自己实现的这个缓存不支持分布式
那么我们要怎么使用这个第三方的缓存呢?
1、首先要导jar包
在这里插入图片描述
需要注意,hibernate和mybatis所用的ehcache的jar包是有区别的,不要搞错,
特别是我们下载的时候,可以加上关键字,防止弄错
在这里插入图片描述
在这里插入图片描述
拷贝到lib里面来
在这里插入图片描述
下一步就是改mapper里面的东西
在这里插入图片描述

就是改这里,之前我们是没写type,所以是使用的默认的
在这里插入图片描述
在这里插入图片描述
最后一步就是缓存的配置文件放到src下来
在这里插入图片描述
拷贝一下这个文件,再改一下名字
在这里插入图片描述
在这里插入图片描述
对照表:

maxElementsInMemory :设置基于内存的缓存中可存放的对象最大数目 
eternal:设置对象是否为永久的,true表示永不过期,此时将忽略
timeToIdleSeconds 和 timeToLiveSeconds属性; 默认值是false 
timeToIdleSeconds:设置对象空闲最长时间,以秒为单位, 超过这个时间,对象过期。当对象过期时,EHCache会把它从缓存中清除。如果此值为0,表示对象可以无限期地处于空闲状态。 
timeToLiveSeconds:设置对象生存最长时间,超过这个时间,对象过期。如果此值为0,表示对象可以无限期地存在于缓存中. 该属性值必须大于或等于 timeToIdleSeconds 属性值 
overflowToDisk:设置基于内在的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中 
diskPersistent 当jvm结束时是否持久化对象 true false 默认是false
diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)

测试:用上面二级缓存例子即可

用上一篇文章的二级缓存例子就行
在这里插入图片描述
在这里插入图片描述

注意

注意这个报错怎么解决,虽然不解决也没能运行,因为它的作用是只能提示,但是我们还是要知道怎么解决
在这里插入图片描述
在这里插入图片描述
方法一:我们直接不写也行,因为我们一般就用默认的配置就行了

这里我们删掉就行了

二级缓存应用场景

使用场景:对于访问响应速度要求高,但是实时性不高的查询,可以采用二级缓存技术。
速度要求高,但是实时性不高的查询:即数据更新了,暂时拿到旧数据也影响不大的需求

注意:
在使用二级缓存的时候,要设置一下刷新间隔(cache标签中有一个flashInterval属性)来定时刷新二级缓存,这个刷新间隔根据具体需求来设置,比如设置30分钟、60分钟等,单位为毫秒

局限性

Mybatis二级缓存对细粒度的数据,缓存实现不好
场景:
对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次查询都是最新的商品信息,此时如果使用二级缓存,就无法实现当一个商品发生变化只刷新该商品的缓存信息而不刷新其他商品缓存信息,因为二级缓存是mapper级别的,当一个商品的信息发送更新,所有的商品信息缓存数据都会清空。
解决此类问题,需要在业务层根据需要对数据有针对性的缓存

比如可以对经常变化的 数据操作单独放到另一个namespace的mapper中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值