`
Tiwen
  • 浏览: 86190 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

引用iBatis中oscache实现自定义缓存及动态更新技巧

阅读更多

绝大部分情况,使用缓存对效率提升来说是一个非常大的性能提升,但在这种性能提升的背景,缓存数据是否有效,能否支持通知更新,缓存是否支持集群分布式这些问题是作为系统设计环节中必须要考虑的。

大家知道,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看看效果。第一次登录,从缓存中没有取到登录者的菜单处理数据。

 



 

 

我们将菜单处理后的数据,保存在oscache缓存中。



 

 

第二次登录,找到了我们之前的为该用户缓存的数据

 



 

 

我们来修改菜单来检查是否能更具缓存更新策略更新我们的缓存

 



 

用debug模式可以观测到GeneralCacheAdministrator中我们的sysLogin.operator-cache更新策略已经被调用。

 



 

第三次登录,恭喜,我们的缓存已经接到更新策略执行了清除。我们就不用担心缓存数据中的数据过时了。

 



 

 

总结:我们通过观察官方源码得知ibatis中缓存刷新机制和缓存使用机制,再利用合理规范的反射技术来获取jvm中ibatis使用的oscache对象,按照ibatis的刷新规范在缓存时保存选择使用缓存刷新策略,从而实现了我们自定义缓存和缓存动态更新的功能。重要的不在于大家对这功能的掌握,更关键的是对缓存设计思路的理解。


原创文章,如果转载,请标注作者:田文 CSDN地址:http://blog.csdn.net/tiwen818

  • 大小: 61.7 KB
  • 大小: 47.6 KB
  • 大小: 61.6 KB
  • 大小: 83 KB
  • 大小: 47.7 KB
  • 大小: 78.1 KB
分享到:
评论

相关推荐

    ibatis_数据缓存

    - 目前iBatis内置了四种Cache实现,包括LRU、FIFO、Memory和OsCache,但不支持用户自定义扩展Cache。 - 用户可以指定Cache的数量。 - Cache的put和get方法内部实现了同步,但在外部没有同步,这意味着当同一参数的...

    iBATIS缓存介绍

    - **3.2.5 自定义高速缓存模型**:允许开发人员自定义缓存实现。 **3.3 高速缓存的清除** 可以通过编程的方式调用相应的API来清除缓存,例如调用`SqlSession.clearCache()`。 **3.4 设置高速缓存模式实现的特性**...

    ibatis 缓存配置策略

    值得注意的是,目前iBatis并不支持用户自定义扩展Cache实现。 Cache的数量可以在配置中指定,以满足不同业务场景的需求。至于缓存的并发控制,iBatis 在 `put` 和 `get` 方法内部进行了同步处理,但在外部无同步,...

    iBATIS实战

    书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。书的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该示例涵盖全书的...

    ibatis.doc

    缓存(Cache)功能是iBATIS提高性能的重要手段,它提供了几种类型的缓存策略,包括MEMORY类型(基于内存的缓存,可能使用WeakReference防止内存泄漏)、LRU(Least Recently Used,最近最少使用,一种淘汰算法)和...

    ibatis 开发指南,开发手册 txt 版

    - `OSCACHE`: 操作系统级别的缓存,利用本地操作系统提供的缓存机制。 - 这些缓存机制可以显著提高数据访问效率和响应速度。 ### 总结 iBatis作为一个灵活的数据库操作框架,为开发者提供了强大的SQL控制能力,...

    struts2,hibernate,spring,ibatis面试合集

    二级缓存可跨Session,常用产品有EHcache和Oscache。 4. **加载策略**:支持延迟加载,提高性能。 5. **优化策略**:如使用双向一对多关联,灵活配置对象缓存等。 **Spring**是一个全面的、模块化的应用框架,主要...

    Mybatis框架学习

    - **一级缓存**:SqlSession 范围内的缓存,当同一个 SqlSession 执行相同的 SQL 时,如果数据未发生变化,则直接从缓存中获取结果。 - **二级缓存**:跨 SqlSession 的缓存,通常用于提高读取性能。MyBatis 默认并...

    jeefuseMDA用户开发手册1

    iBatis则是一个轻量级的框架,允许开发者自定义SQL语句,提供了更灵活的数据访问控制。 2. 控制反转(IoC)与依赖注入(DI): Spring3 是Java领域中广泛应用的IoC/DI容器。它管理对象的生命周期,负责对象间的...

    java必备知识点大全.pdf

    Java必备知识点大全的内容非常丰富,涵盖了Java语言的基础知识、常用的...OSCache概述:OSCache用于将频繁访问的数据缓存在内存中,减少磁盘I/O操作。 OSCache+auto:自动管理OSCache的使用,确保缓存的性能和效率。

    J2EE开发之常用开源项目小记

    此外,SpringMVC还支持拦截器,但需要开发者自定义实现。 3. **视图层**: - **JSTL**:JavaServer Pages Standard Tag Library,用于增强JSP页面的功能,提供了许多内置标签,被认为是最快的JSP标签库之一。 - *...

    自整理Java关于基础和框架的面试题

    - **OSCache**:一种缓存机制,用于提高Web应用的性能。 ##### 经常访问的技术网站 - Stack Overflow、GitHub、MDN Web Docs等。 ##### 项目团队中交流的工具 - Slack、钉钉、企业微信等。 ##### 平时浏览的书籍 ...

    java面试知识

    - **MyBatis (原Ibatis)**:半ORM框架,提供动态SQL支持。 - **JDBC**:直接与数据库交互,灵活性高但编码繁琐。 ##### Hibernate的运行原理 - **Session**:负责持久化操作。 - **SessionFactory**:创建Session...

    Java 亚信上海 面试题

    - 可以利用`Set`集合或自定义函数实现。 **Struts框架原理介绍:** - 基于MVC(Model-View-Controller)架构的Java Web框架。 - 控制器负责接收用户请求并转发给相应的模型处理。 - 视图层通常使用JSP或FreeMarker...

Global site tag (gtag.js) - Google Analytics