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

oscache 的问题

    博客分类:
  • java
 
阅读更多

一:现象:

系统页面无法打开,数据显示异常

二:原因分析:(代码分析,比较枯燥,请耐心查看)

 

在使用oscache的时候,为了减轻开发者的负担,同时也让代码具有更好的可读性,我们一般会使用annotation的方式来完成缓存的设值和取值

Code1

 

在调用当前方法的时候 会调用annotation拦截器的方法进行拦截,然后将返回值设置到缓存系统并返回。调研系统annotation拦截器调用的方法为CacheInterceptor.java doCache 方法

Code:2

 

问题出现在第二步和第三部的连贯上,在oscache中,EntryUpdateStatecache entry当前所处状态的表示,oscache尽量避免了使用synchronize,引入了许多状态参量。状态变迁图示如下:

假设在A线程调用getCache的时候,缓存条目不存在,或者过期,oscache会抛出一个异常,也就是臭名昭著的NeedsRefreshException,当这个异常出现,相应的EntryUpdateState的状态为updating(也就是更新中),此时如果B线程再来调用,就会block住,代码如下:

一个do  while循环。只有当A 调用 putInCache EntryUpdateState的状态变为complete,同时会调用updateState.notifyAll() 方法解除wait动作)或者cancelUpdate(状态此时的装变为cancelled,同时调用updateState.notify() 方法解除wait动作)方法才会打破这个循环。

getCachedObject中如果抛出这个异常,会怎么样呢?看代码:

Code4

从代码中,可以看到处理逻辑是捕捉这个异常,并将cachedObject设置为空,并返回。

 

因此就看第三步了,代码如下:

Code5

上面code4代码逻辑如下:

一:如果缓存返回值为空,则调用本地方法进行执行

二:如果执行结果为空,调用 cancelUpdate 方法将状态更新

三:如果执行结果不为空,则调用putInCache 方法将结果放入到缓存中

四:返回结果

请大家闭上眼睛思考下,上面一段代码

 

正常情况下,这段代码不会有问题,但是如果此时本地方法调用出现异常,会怎么样呢?也就是说pjp.proceed();这段代码抛出异常,此时当前A线程就永远不会更新状态,并进行notify操作,那么此时B线程就会一直在循环中,并堵塞以后所有的线程操作,最终结果就是操作会越来越缓慢,应用死掉。

解决方法其实也很简单,就是捕捉应用抛出的异常

Code6

后记:一路分析,抛出这个NeedsRefreshException 倒没有什么问题,关键还是那个状态问题,那么就要思考这个状态一定要么?如果不要可以么?如果可以的话,那么oscache当时为什么要这个状态呢?

 

 

  • 大小: 55.3 KB
  • 大小: 89.4 KB
  • 大小: 18.6 KB
  • 大小: 29.5 KB
  • 大小: 71.6 KB
  • 大小: 59.5 KB
  • 大小: 31 KB
分享到:
评论

相关推荐

    oscache-2.1.jar

    oscache-2.1.jar oscache-2.1.jar

    OSCache配置说明文档

    OSCache由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。OSCache是一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决...

    oscache(JSP定制标记应用)

    javaweb做页面缓存常用,OSCache是一个工业级的J2EE缓存实现。OSCache不但能缓存java对象,还可以缓存页面,http请求和二进制内容,例如pdf文件等。通过应用OSCache,我们不但可以实现通常的Cache功能,还能够改善...

    用OSCache进行缓存对象

    1、OSCache是什么? 2、OSCache的特点 3、有关“用OSCache进行缓存对象”的研究

    oscache文档

    OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的...

    oscache的例子

    OSCache标记库由OpenSymphony设计,它是一种开创性的缓存方案,它提供了在现有JSP页面之内实现内存缓存的功能。OSCache是个一个被广泛采用的高性能的J2EE缓存框架,OSCache还能应用于任何Java应用程序的普通的缓存...

    oscache缓存技术入门实例

    oscache缓存技术入门实例

    OSCache学习例子 实例

    OSCache学习例子 实例 很好的与j2ee结合

    oscache 使用介紹

    OSCache是OpenSymphony这个开源项目众多Projects中的一个。他是一个高效的J2EE缓存框架,能够很好的解决动态网站速度的问题。

    Oscache使用手册

    Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中,通过缓存页面的...OSCache是个一个被广泛采用的高性能的J2EE缓存框架,OSCache还能应用于任何Java应用程序的普通的缓存解决方案。。。。

    Oscache框架的搭建步骤

    使用oscache进行缓存,大大提高web系统运行效率

    oscache jar包下载

    oscache-2.4.1.jar资源包,用于java缓存、jsp页面缓存

    OSCache需要的包

    oscache.tld,oscahe.properties,oscache-2.1.jar,commons

    oscache-java缓存框架

    oscache-java缓存框架插件和安装教程,使用教程一步到位

    oscache详细配置文档

    本文叙述了如何使用oscanche,最后的配置需要在oscache.properties中完成

    oscache-2.2jar包

    oscache-2.2jar包

    JavaEE源代码 oscache-2.1

    JavaEE源代码 oscache-2.1JavaEE源代码 oscache-2.1JavaEE源代码 oscache-2.1JavaEE源代码 oscache-2.1JavaEE源代码 oscache-2.1JavaEE源代码 oscache-2.1JavaEE源代码 oscache-2.1JavaEE源代码 oscache-2.1JavaEE源...

    oscache说明

    oscache的简单介绍

    oscache所需jar包

    commons-logging.jar包 oscache-2.4.1.jar包 oscache-2.4.1.jar

    oscache的使用

    oscache的使用

Global site tag (gtag.js) - Google Analytics