动漫网站的建设目标,效果最好h5制作软件,wordpress youku videos,视频号网页版怎么发布视频最近在做一个项目#xff0c;为处理并发性较差的问题#xff0c;使用了Mybatis二级缓存 但在多表联合查询的情况下#xff0c;Mybatis二级缓存是存在着数据脏读的问题的 两天就是在想办法解决这个数据脏读的问题 考虑到简易性、性能、兼容性、可扩展性#xff0c;我选择了s…最近在做一个项目为处理并发性较差的问题使用了Mybatis二级缓存 但在多表联合查询的情况下Mybatis二级缓存是存在着数据脏读的问题的 两天就是在想办法解决这个数据脏读的问题 考虑到简易性、性能、兼容性、可扩展性我选择了springboot自带的 Ehcache 框架来整合解决这个问题 我也是第一次接触到 Ehcache 这个框架所以也算从零开始 根据Mybatis二级缓存的特点我的思路是 每当 增删改 某张表 就清除刷新其关联的所有表的 缓存 这里可分为两个大小方向 在 增删改 的方法上做相关的 关联清除缓存 操作 —— 这个就比较细节化一点做的修改可能会比较多 在 增删改方法 所在类的整体上做相关的 关联清除缓存操作 —— 这个我需要做的修改就相对少点但这样里面每个方法包括一些无关紧要的都会触发这个清除缓存操作 都各有利弊 一路上并不顺利 一开始我尝试自己看能不能找到比较好的方法但刚接触一下子就自己解决也是不太可能的 但有看到一个解决Mybatis二级缓存问题的插件 —— GitHub上 LuanLouis 的 mybatis-enhanced-cache 但这个project是5年前写的而且最近一次更新也只是2年前现在技术发展那么快看到的时候就感觉可能不行 后面自己也下载了下来mvn install 发现不成功缺少ojdbc14的jar包 网上说ojdbc14.jar 是收费的所以中央库是导不了这个包 看了一些资料说Oracle安装目录里面有但公司这台没装Oracle 也有资料说可以用 ojdbc6 或其他ojdbc代替我就下载了ojdbc6 和ojdbc8 都试了一下都能够解决那个ojdbc jar包的问题 mybatis-enhanced-cache 插件的jar也成功导入了maven库和项目中但导入之后用的时候却又发现报各种错就觉得凉了 本来就是为了简单快速才想用别人的插件所以我不可能自己又去修改这个插件来用改了又不一定能用所以使用插件这个方案就只能放弃了 后来又找了网上很多资料也按很多示例的步骤做了 像各种注解、各种配置什么的都不知道是和mybatis的注解冲突了还是我写的无效 像网上很多资料说的mybatis二级缓存是不推荐使用的至于为什么我还要用可以看我前面一篇文章—— 缓存的设计与使用 所以在方面遇到我这样问题的应该没几个也就找不到多少资料只能靠自己 想了很多可能性试了一次又一次想尽量做得简单点直接简单XML配置加注解 能够这样就好了。 但现实是残酷的做了不知多少次的尝试还是没成功无计可施最后还是只能放弃这个方案了 没有办法就只能选择最后一种方案了 —— 自己写代码在业务逻辑层 做处理 这对一无所知的菜鸟也不容易啊 好在坚持尝试最后终于找到解决方案 配置 ehcache.xml 1 ?xml version1.0 encodingUTF-8?2 !-- ehcache --3 ehcache xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance4 xsi:noNamespaceSchemaLocationehcache.xsd5 6 !--7 磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存8 path:指定在硬盘上存储对象的路径9 path可以配置的目录有
10 user.home用户的家目录
11 user.dir用户当前的工作目录
12 java.io.tmpdir默认的临时目录
13 ehcache.disk.store.direhcache的配置目录
14 绝对路径如d:\\ehcache
15 查看路径方法String tmpDir System.getProperty(java.io.tmpdir);
16 --
17 diskStore pathjava.io.tmpdir /
18
19 !-- 配置提供者 1、peerDiscovery提供者方式有两种方式自动发现(automatic)、手动配置(manual) 2、rmiUrls手动方式时提供者的地址多个的话用|隔开 --
20 !-- cacheManagerPeerProviderFactory
21 classnet.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory
22 propertiespeerDiscoverymanual,rmiUrls//127.0.0.1:40002/userCache / --
23 cacheManagerPeerProviderFactory
24 classnet.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory
25 propertiespeerDiscoveryautomatic, multicastGroupAddress230.0.0.1, multicastGroupPort4446,timeToLive255/
26 !-- cacheManagerPeerProviderFactory
27 classorg.ehcache.distribution.RMICacheManagerPeerProviderFactory
28 propertiespeerDiscoveryautomatic, multicastGroupAddress230.0.0.1, multicastGroupPort4446,timeToLive255/ --
29
30 !-- 配置监听器 1、hostName 主机地址 2、port 端口 3、socketTimeoutMillis socket子模块的超时时间默认是2000ms --
31 !-- cacheManagerPeerListenerFactory
32 classnet.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory
33 propertieshostName127.0.0.1, port40001, socketTimeoutMillis2000 / --
34 cacheManagerPeerListenerFactory
35 classnet.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory/
36
37
38 !--
39 defaultCache:默认的缓存配置信息,如果不加特殊说明,则所有对象按照此配置项处理
40 maxElementsInMemory:设置了缓存的上限,最多存储多少个记录对象
41 eternal:代表对象是否永不过期 (指定true则下面两项配置需为0无限期)
42 timeToIdleSeconds:最大的闲置时间 /秒
43 timeToLiveSeconds:最大的存活时间 /秒
44 overflowToDisk:是否允许对象被写入到磁盘
45 说明下列配置自缓存建立起600秒(10分钟)有效 。
46 在有效的600秒(10分钟)内如果连续120秒(2分钟)未访问缓存则缓存失效。
47 就算有访问也只会存活600秒。
48 --
49 defaultCache maxElementsInMemory10000 eternalfalse
50 timeToIdleSeconds600 timeToLiveSeconds600 overflowToDisktrue /
51
52 cache name*.*.*.*.dao.WarnMapper maxElementsInMemory10000 eternalfalse
53 timeToIdleSeconds120 timeToLiveSeconds300 overflowToDisktrue /
54
55 cache name*.*.*.*.dao.ProjectMapper maxElementsInMemory10000 eternalfalse 56 timeToIdleSeconds120 timeToLiveSeconds300 overflowToDisktrue / 57 /ehcache 配置 application.properties 1 # Ehcache缓存
2 spring.cache.typeehcache
3 spring.cache.ehcache.configclasspath:/ehcache.xml 业务逻辑层代码 1 package *.*.*.common.utils;2 3 import net.sf.ehcache.Cache;4 import net.sf.ehcache.CacheManager;5 6 public class EhcacheUtil {7 8 // 构建一个缓存管理器9 private static CacheManager cacheManager CacheManager.newInstance(src/main/resources/ehcache.xml);
10
11 /**
12 * action 清除相关联的缓存
13 * param cacheName 缓存所在namespace的名称
14 * param keys 缓存所在namespace下key的名称为空则默认清空所有key
15 * return
16 */
17 public static void clearRelatedCache( String cacheName, String[] keys ) {
18 Cache cache cacheManager.getCache(cacheName) ;
19 if ( cachenull ) {
20 return ;
21 }
22 //若缓存不为空
23 if ( keysnull || keys.length0 ) {
24 cache.removeAll();
25 }
26 else {
27 for (String key : keys) {
28 cache.remove(key) ;
29 }
30 }
31 }
32
33 } 1 PostMapping(/delete)2 public Result delete(HttpServletRequest request) {3 Long projectId StringUtil.getLong(request.getParameter(id)) ;4 Project project projectService.findById(projectId) ;5 if(projectnull) {6 return ResultGenerator.genFailResult(ResultCode.UNAUTHORIZED, 工程id不正确);7 }8 projectService.deleteById(projectId);;9 EhcacheUtil.clearRelatedCache(CacheConstants.CACHE_NAMESPACE_WARNMAPPER, null) ;
10 return ResultGenerator.genSuccessResult(删除成功);
11 } 共同学习共同进步若有补充欢迎指出谢谢转载于:https://www.cnblogs.com/dengguangxue/p/11276791.html