绝大部分情况,使用缓存对效率提升来说是一个非常大的性能提升,但在这种性能提升的背景,缓存数据是否有效,能否支持通知更新,缓存是否支持集群分布式这些问题是作为系统设计环节中必须要考虑的。
大家知道,ibatis对oscache提供了很好的支持,在更新刷新缓存,支持集群方面做的还算是令人满意。平时开发过程中也会遇到一些非SQL查询缓存需求,如登录用户部分登录处理过后信息需要能够被及时缓存起来,这是一个面向于一个用户级缓存,缓存范围非session会话级别的。如果数据库相关数据变动后,又需要对这些缓存数据进行通知更新。为了解决这个问题,我们可以使用两种办法:
1、 对缓存的数据通过SQL语句查询搞定,在OSCACHE缓存策略上进行刷新策略配置;
2、 直接使用OSCACHE中缓存刷新策略,对内存对象数据直接保存;
对与方法1,是基于ibatis本身对sql缓存的机制实现,但这样的实现是基于SQL形式,如果缓存数据不是能很好通过SQL查询结果时,还是存在一定的限制性。为了脱离SQL缓存,找出一种直接缓存,又可以得到相关数据变动更新的办法,我们就需要采用方法2。
针对于方法2中可以直接使用ibatis中oscache缓存,又可以采取数据变更通知。我的原理很简单,在一个jvm中,直接找到ibatis的oscache引用来实现自定义数据缓存。根据这种思路,我们查看一下ibatis中oscache引用代码com.ibatis.sqlmap.engine.cache.oscache. OSCacheController。看到下面OSCacheController代码红色部分,oscache被应用成静态private变量了,还是final,这样更好,反正我们不会去改他的引用,并且这个对象在jvm中就只有一份。大家注意在看flush代码,通过debug实践,可以得出他就是我们缓存更新策略生效时会调用的清理缓存方法,这点很重要,基于这个机制,是实现后面自定义缓存的关键部分。
接下来的事情很简单,看下面staitc代码部分,利用反射的机制,在jvm中取到OSCacheController.CACHE成员变量的引用,即使它是private,但是在sun公司的合法规范下,还是都能获取的到。:)获取到引用后,我们根据官方的接口也实现一下putObject、getObject、removeObject方法,只是这些方法中我们不在使用ibatis官方的CacheModel缓存对象了,使得方法变得更加简单。注意,我们提供的putObject方法带有cacheId参数,这个参数很重要,根据上面我们提到的官方缓存更新策略生效时,会调用flush方法的原理,我们在缓存自定义数据的同时,一定要指明我们需要使用缓存刷新策略的id是多少。因为通过反射机制,我们拿到了OSCacheController的CACHE引用,CACHE又是静态变量,我们缓存的数据和ibatis本身的缓存数据是用的同一个oacache,并且它更新缓存策略时,我拿过来的oscache对象也会同时更新。
接下来我们做个例子,我们BIAP集成系统管理平台提高了统一的集成应用展现框架,并且在用户登录的时候动态去生成用户有权限访问的菜单,菜单是通过登录用户权限信息生成的html字符,生成过程较为耗时。在登录过程中,我们已经对登录相关的查询都进行了ibatis缓存,更新策略如下:
登录代码里我们改动一下组装菜单部分的代码,缓存的key我们使用固定常量CACHE_MENU+用户登录id。在绿色部分先去判断缓存中有没有,处理好的菜单数据,没有的话我们通过调用私有menuProcess(operator)方法处理菜单,并且在下列红色代码部分中,将处理好的菜单数据menu放置在缓存中,并且使用常量CACHE_ID,CACHE_ID值为sysLogin.operator-cache,对没错,就是我们更新策略中SqlMap的namespace+cacheModel的id组合。
接下来我们debug看看效果。第一次登录,从缓存中没有取到登录者的菜单处理数据。
![](http://dl.iteye.com/upload/attachment/582166/66f5de89-0ecf-3fbc-8247-8b1cd8ab0fee.jpg)
我们将菜单处理后的数据,保存在oscache缓存中。
![](http://dl.iteye.com/upload/attachment/582168/8fbede74-ca3c-33be-bd4a-84773b5fefb6.jpg)
第二次登录,找到了我们之前的为该用户缓存的数据
![](http://dl.iteye.com/upload/attachment/582170/28042fc0-c9f4-357f-aff7-5c4762794ffd.jpg)
我们来修改菜单来检查是否能更具缓存更新策略更新我们的缓存
![](http://dl.iteye.com/upload/attachment/582172/7c2df544-1d87-3029-bc4e-f17e7ea71f2c.jpg)
用debug模式可以观测到GeneralCacheAdministrator中我们的sysLogin.operator-cache更新策略已经被调用。
![](http://dl.iteye.com/upload/attachment/582176/7c606262-26e3-3fac-aa3b-2f32851c28e3.jpg)
第三次登录,恭喜,我们的缓存已经接到更新策略执行了清除。我们就不用担心缓存数据中的数据过时了。
![](http://dl.iteye.com/upload/attachment/582178/691c7993-47e2-36a3-8609-83e2b4c150e0.jpg)
总结:我们通过观察官方源码得知ibatis中缓存刷新机制和缓存使用机制,再利用合理规范的反射技术来获取jvm中ibatis使用的oscache对象,按照ibatis的刷新规范在缓存时保存选择使用缓存刷新策略,从而实现了我们自定义缓存和缓存动态更新的功能。重要的不在于大家对这功能的掌握,更关键的是对缓存设计思路的理解。
原创文章,如果转载,请标注作者:田文 CSDN地址:http://blog.csdn.net/tiwen818
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0058/2166/66f5de89-0ecf-3fbc-8247-8b1cd8ab0fee-thumb.jpg)
- 大小: 61.7 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0058/2168/8fbede74-ca3c-33be-bd4a-84773b5fefb6-thumb.jpg)
- 大小: 47.6 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0058/2170/28042fc0-c9f4-357f-aff7-5c4762794ffd-thumb.jpg)
- 大小: 61.6 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0058/2172/7c2df544-1d87-3029-bc4e-f17e7ea71f2c-thumb.jpg)
- 大小: 83 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0058/2176/7c606262-26e3-3fac-aa3b-2f32851c28e3-thumb.jpg)
- 大小: 47.7 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0058/2178/691c7993-47e2-36a3-8609-83e2b4c150e0-thumb.jpg)
- 大小: 78.1 KB
分享到:
相关推荐
codemirror版本:https://codemirror.net/5/doc/releases.html
外国电影演员识别系统源码分享
mf3010 打印扫描一体机驱动管理软件。
2024免费毕业设计成品,包括源码+数据库+往届论文资料 启动教程:https://www.bilibili.com/video/BV11ktveuE2d 讲解视频:https://www.bilibili.com/video/BV1YfkHYwEME 二次开发教程:https://www.bilibili.com/video/BV1Cw2rY1ErC
chrome-headless-shell-linux64-135.0.7004.0 (Canary).zip
DeepSeek大模型介绍与展望.pptx
英特尔的公版原理图和PCB,cadence版本
《单容水箱液位精准调控:模糊控制策略的深度研究与复现》,单容水箱液位随动系统的模糊控制研究 模糊控制lunwen复现 期刊:化工与自动化仪表(2021年) 图1为结构图,图9为原文结构图, 版本不一样,器件略有调整 图7为结果图,图8为原文结果图 ,单容水箱液位;模糊控制;研究;论文复现;期刊;化工与自动化仪表;结构图;结果图;版本差异;器件调整,"模糊控制研究在单容水箱液位随动系统中的应用与复现"
一个windows上使用的搜索小工具
内容: 这份数据集包含了来自国际大洋发现计划(IODP)第342航次站点U1405、U1406、U1407、U1409和U1410的浮游有孔虫碳酸盐团簇同位素、稳定氧和碳同位素,以及沉积物中的GDGT(甘油二烷基甘油四醚)和烯酮数据。这些站点位于北大西洋的新foundland脊(U1407、U1409和U1410)和J-异常脊(U1405和U1406),用于创建覆盖整个新生代的几乎连续但低分辨率(约每92万年一个样本)的数据拼接,并重建了碳酸盐团簇同位素、TEX86和UK'37海表温度。每个样本包含20立方厘米的沉积物,覆盖2厘米的核心深度区间。年龄模型主要基于详细的船上生物-磁性地层学研究(Norris等,2014)。然而,在40.8 Ma至44.8 Ma时间段内,使用了Cappelli等人(2019)更新的U1410站点年龄模型,通过与U1408站点的年龄模型对比来确定。 访问此数据集,请点击这里:"" ()。
厨房用品分割系统源码&数据集分享
.
监控鞋类物品检测系统源码分享
2024免费毕业设计成品,包括源码+数据库+往届论文资料 启动教程:https://www.bilibili.com/video/BV11ktveuE2d 讲解视频:https://www.bilibili.com/video/BV1YfkHYwEME 二次开发教程:https://www.bilibili.com/video/BV1Cw2rY1ErC
曲线图异常波形检测系统源码分享
内容概要:本文介绍了动车组车号自动识别的现状及其存在的问题,提出了基于图像识别技术的新方法。文中详述了传统人工识别与RFID识别方法的不足,重点阐述了一种新的图像识别系统的设计与实施方案,该系统能够实现在多种恶劣环境下高效精确地获取动车组车号,并通过实际案例展示了这套系统的优势以及其在铁路行业的广阔应用前景。 适用人群:从事铁路运输管理、轨道交通系统开发维护的技术人员,尤其是负责动车组调度、监控及维修工作的相关人员。 使用场景及目标:①用于替代现有人工记录与RFID标签方式,提升动车组车号识别精度与效率;②适用于各种天气状况下的户外作业场景;③旨在构建更加智能化、信息化程度更高的铁路运输体系,助力智慧动车段建设。 其他说明:文中还包括具体的实验对比和技术细节分析,如不同的开机触发装置选择、图像采集设备参数设置、补光措施及识别算法的设计,强调了实际应用场景中可能遇到的问题以及相应的解决方案。
基于AnythingLLM框架和Ollama环境本地运行deepseek,并可以通过用户自己的文档来针对性地回答用户问题,用户也可以上传文件来构建模型回复问题所需要的所有参考资料的知识库,使得模型相对于在线模型更加专业地解答用户的问题。同时本地部署保证了隐私性和针对性。
指针式表盘指针关键部位分割系统源码&数据集分享
多策略增强:MWOA鲸鱼优化算法与其他变体及2024年最新算法的实证比较与结果分析——新颖策略实施效果显著且复杂度无增加的研究,多策略改进的鲸鱼优化算法(MWOA),与其他三种变体和几种2024最新算法比较,策略都是很新颖的策略,可以直接写了发文章,并且没有增加复杂度上改进效果 ,MWOA; 变体算法; 最新算法; 策略新颖; 复杂度未增加; 改进效果显著,"多策略改进MWOA算法:与多种变体及2024新算法比较展示优越性"
织物缺陷检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]