`
tianzizhi
  • 浏览: 15035 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

oscache 避免使用cacelupdate的原因

阅读更多
oscache 使用一个状态对象控制缓存更新的过程
其对象共有四个状态 1: 未赋值状态,2 正在更新状态 3 更新完成状态 4 取消更新状态
多线程操作时就是操作这个对象的几个状态
下面代码是oscache官方推荐的使用方法:
* // ---------------------------------------------------------------
 * // Typical use with fail over
 * // ---------------------------------------------------------------
 * String myKey = "myKey";
 * String myValue;
 * int myRefreshPeriod = 1000;
 * try {
 *     // Get from the cache
 *     myValue = (String) admin.getFromCache(myKey, myRefreshPeriod);
 * } catch (NeedsRefreshException nre) {
 *     try {
 *         // Get the value (probably by calling an EJB)
 *         myValue = "This is the content retrieved.";
 *         // Store in the cache
 *         admin.putInCache(myKey, myValue);
 *     } catch (Exception ex) {
 *         // We have the current content if we want fail-over.
 *         myValue = (String) nre.getCacheContent();
 *         // It is essential that cancelUpdate is called if the
 *         // cached content is not rebuilt
 *         admin.cancelUpdate(myKey);
 *     }
 * }

等待的线程栈:
"http-92-50" - Thread t@80
   java.lang.Thread.State: WAITING
	at java.lang.Object.wait(Native Method)
	- waiting on <15be4b4> (a com.opensymphony.oscache.base.EntryUpdateState)
	at java.lang.Object.wait(Object.java:485)
	at com.opensymphony.oscache.base.Cache.getFromCache(Cache.java:278)
	at com.opensymphony.oscache.base.Cache.getFromCache(Cache.java:221)
	at com.opensymphony.oscache.general.GeneralCacheAdministrator.getFromCache(GeneralCacheAdministrator.java:151)


上述代码的admin.cancelUpdate(key); 发生线程阻塞的情况的状态:
  如果同时多个线程对一个key发生访问,第一个线程得到锁后发现为空(状态为1)抛出nre异常并释放锁在catch里去更新数据,第二个线程进入由于发现别一个线程在更新(状态为2),于是waiting.其它线程则处于监视状态直到第二个线程释放状态对象 ,如果第一个线程更新时发生错误,于是cancelUpdate 状态改为(状态4),并释放锁通知第二个线程,它得到锁后发现状态是4则执行iscancel判断后的操作,操作状态改为4,释放锁后,第三个线程时来发现状态为4,于是等待,但这时也没有别的线程在执行更新对象操作了,自己也拿着锁,别人也进不来了,于是此线程一直会处于waiting状态,随着程序的长时间运行其它也取此key的监视线程会一直增加,浪费线程资源,严重时会导致内存溢出

我的解决办法改为admin.put(key,null);  第二个线程会将状态设为3,由于value为null,第三个线程取时会发现状态对象为1,会执行更新缓存操作,不会使第三个线程处于等待状态
分享到:
评论

相关推荐

    oscache的使用实例和详解

    总的来说,osCache是一个功能强大、易于使用的Java缓存框架,对于优化应用性能、减轻数据库压力具有重要作用。通过深入理解和合理利用osCache的各项特性,开发者可以构建出更加高效、稳定的应用系统。

    Oscache使用教程

    **Oscache使用教程** Oscache是一款开源的Java缓存解决方案,主要用于提高Web应用程序的性能,通过在内存中存储经常访问的数据,避免了频繁的数据库查询,从而减少了系统响应时间。本文将深入探讨Oscache的基本原理...

    OSCache配置说明文档

    本文档详细介绍了OSCache的配置与使用,旨在为开发者提供一份全面的参考指南。OSCache是由OpenSymphony开发的开源缓存框架,它为J2EE应用程序提供了高效、灵活的缓存解决方案。 文档介绍 文档目的: 本文档的主要...

    OsCache缓存框架使用示例

    本示例将通过一个天气预报Web服务的场景,详细介绍OsCache的使用方法。 首先,我们需要了解OsCache的基本概念。OsCache的核心是基于哈希表的数据结构,它可以在内存中存储对象,支持自动过期策略,可以设置缓存项的...

    oscache缓存使用总结.doc

    OSCache 是一个广泛使用的开源缓存解决方案,尤其在Java应用中,它被JBoss, Hibernate, Spring等知名框架所支持。其主要特点是配置简单,适用于页面级别的缓存管理。以下是对OSCache配置和使用过程的详细说明: 1. ...

    教你如何用好oscache的详细文档

    当内容在短时间内不会改变或频繁被请求时,使用缓存可以避免每次请求都从数据库中获取数据,从而提高用户体验。 ### 二、osCache 的主要功能 1. **不分页面缓存**:osCache 支持对对象级别的缓存,无论对象大小,...

    oscache,缓存机制的使用

    标题与描述概述的知识点主要集中在oscache的使用及其在Java环境下的配置与实施。oscache是一种缓存机制,主要用于提高Web应用的响应速度和优化系统性能。以下是对这些知识点的详细解析: ### oscache简介 oscache...

    oscache 使用介紹

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

    oscache的一些使用

    **osCache:轻量级缓存解决方案** osCache是一款开源的、轻量级的缓存框架,主要用于提高Java应用程序的性能和效率。它通过在内存中存储数据,...理解并熟练掌握osCache的使用,对于提升Java应用性能具有重要意义。

    OSCache学习例子 实例

    在这个"OSCache学习例子 实例"中,我们将深入探讨如何在J2EE环境中集成并使用OSCache。 首先,理解OSCache的基本概念至关重要。OSCache的核心功能是提供内存中的对象缓存,它支持两种主要的缓存模式:本地缓存和...

    oscache缓存配置

    osCache的核心功能是提供了一个内存中的对象缓存系统,通过将常用数据暂存到内存中,避免了频繁的数据库查询,从而显著提升应用程序的性能。 在开始配置osCache之前,我们需要了解其基本概念和工作原理。osCache...

    oscache处理

    osCache就是这样一种缓存解决方案,它能够有效地缓存对象和数据,避免频繁的数据库查询。 osCache是开源的Java缓存框架,它提供了一种简单而强大的方式来管理和共享应用程序中的数据。osCache可以被集成到各种Java...

    OSCache需要的包

    在这个特定的案例中,`oscache.tld` 提供了关于OSCache JSP标签的元数据,如标签的名称、属性、行为等,使得开发者能够在JSP页面上方便地使用OSCache提供的缓存功能。 `oscache.properties` 是OSCache的配置文件,...

    oscache-java缓存框架

    - **API集成**:使用osCache提供的API进行缓存的增删改查操作,如`CacheManager.getInstance().getCache("myCache")`获取缓存实例。 4. **使用教程** - **创建缓存**:定义一个缓存,例如`Cache cache = ...

    oscache详细配置文档

    本文将详细介绍 OSCache 的配置和使用方法。 **一、缓存整个页面** OSCache 提供了一个名为 `CacheFilter` 的过滤器,该过滤器用于实现页面级别的缓存。通过在 `web.xml` 文件中配置,我们可以指定哪些页面或一组...

    Oscache框架的搭建步骤

    6. **集成到JSP页面**:在JSP页面中引入Oscache标签库,使用`&lt;%@taglib uri="oscache" prefix="cache"%&gt;`声明,其中`uri`值应与`web.xml`中配置的`&lt;taglib-uri&gt;`一致。 7. **实现缓存逻辑**:在JSP页面中利用...

    oscache-2.4.1-full

    OSCache基于内存的缓存系统能够将经常访问的数据存储在内存中,避免了每次请求时都需要从数据库中获取数据的开销。通过缓存热点数据,它可以显著提升Web应用的响应速度,降低延迟,提高用户体验。 2. **JSP定制...

Global site tag (gtag.js) - Google Analytics