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是一个功能强大、易于使用的Java缓存框架,对于优化应用性能、减轻数据库压力具有重要作用。通过深入理解和合理利用osCache的各项特性,开发者可以构建出更加高效、稳定的应用系统。
**Oscache使用教程** Oscache是一款开源的Java缓存解决方案,主要用于提高Web应用程序的性能,通过在内存中存储经常访问的数据,避免了频繁的数据库查询,从而减少了系统响应时间。本文将深入探讨Oscache的基本原理...
本文档详细介绍了OSCache的配置与使用,旨在为开发者提供一份全面的参考指南。OSCache是由OpenSymphony开发的开源缓存框架,它为J2EE应用程序提供了高效、灵活的缓存解决方案。 文档介绍 文档目的: 本文档的主要...
本示例将通过一个天气预报Web服务的场景,详细介绍OsCache的使用方法。 首先,我们需要了解OsCache的基本概念。OsCache的核心是基于哈希表的数据结构,它可以在内存中存储对象,支持自动过期策略,可以设置缓存项的...
OSCache 是一个广泛使用的开源缓存解决方案,尤其在Java应用中,它被JBoss, Hibernate, Spring等知名框架所支持。其主要特点是配置简单,适用于页面级别的缓存管理。以下是对OSCache配置和使用过程的详细说明: 1. ...
当内容在短时间内不会改变或频繁被请求时,使用缓存可以避免每次请求都从数据库中获取数据,从而提高用户体验。 ### 二、osCache 的主要功能 1. **不分页面缓存**:osCache 支持对对象级别的缓存,无论对象大小,...
标题与描述概述的知识点主要集中在oscache的使用及其在Java环境下的配置与实施。oscache是一种缓存机制,主要用于提高Web应用的响应速度和优化系统性能。以下是对这些知识点的详细解析: ### oscache简介 oscache...
OSCache是OpenSymphony这个开源项目众多Projects中的一个。他是一个高效的J2EE缓存框架,能够很好的解决动态网站速度的问题。
**osCache:轻量级缓存解决方案** osCache是一款开源的、轻量级的缓存框架,主要用于提高Java应用程序的性能和效率。它通过在内存中存储数据,...理解并熟练掌握osCache的使用,对于提升Java应用性能具有重要意义。
在这个"OSCache学习例子 实例"中,我们将深入探讨如何在J2EE环境中集成并使用OSCache。 首先,理解OSCache的基本概念至关重要。OSCache的核心功能是提供内存中的对象缓存,它支持两种主要的缓存模式:本地缓存和...
osCache的核心功能是提供了一个内存中的对象缓存系统,通过将常用数据暂存到内存中,避免了频繁的数据库查询,从而显著提升应用程序的性能。 在开始配置osCache之前,我们需要了解其基本概念和工作原理。osCache...
osCache就是这样一种缓存解决方案,它能够有效地缓存对象和数据,避免频繁的数据库查询。 osCache是开源的Java缓存框架,它提供了一种简单而强大的方式来管理和共享应用程序中的数据。osCache可以被集成到各种Java...
在这个特定的案例中,`oscache.tld` 提供了关于OSCache JSP标签的元数据,如标签的名称、属性、行为等,使得开发者能够在JSP页面上方便地使用OSCache提供的缓存功能。 `oscache.properties` 是OSCache的配置文件,...
- **API集成**:使用osCache提供的API进行缓存的增删改查操作,如`CacheManager.getInstance().getCache("myCache")`获取缓存实例。 4. **使用教程** - **创建缓存**:定义一个缓存,例如`Cache cache = ...
本文将详细介绍 OSCache 的配置和使用方法。 **一、缓存整个页面** OSCache 提供了一个名为 `CacheFilter` 的过滤器,该过滤器用于实现页面级别的缓存。通过在 `web.xml` 文件中配置,我们可以指定哪些页面或一组...
6. **集成到JSP页面**:在JSP页面中引入Oscache标签库,使用`<%@taglib uri="oscache" prefix="cache"%>`声明,其中`uri`值应与`web.xml`中配置的`<taglib-uri>`一致。 7. **实现缓存逻辑**:在JSP页面中利用...
OSCache基于内存的缓存系统能够将经常访问的数据存储在内存中,避免了每次请求时都需要从数据库中获取数据的开销。通过缓存热点数据,它可以显著提升Web应用的响应速度,降低延迟,提高用户体验。 2. **JSP定制...