`
fan
  • 浏览: 143442 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于OSCache及NeedsRefreshException

阅读更多
同一个应用可以实例化多个oscache的admin,使用不同的配置策略,如不同的配置文件。例如:
Public class ChatRecordCache {
	private static GeneralCacheAdministrator admin;
	private static String OSCACHE_DISK =  "oscache_disk.properties";
	static {
		Properties prop = new Properties(); 
		try {
			prop.load(new FileInputStream(OSCACHE_DISK));
		} catch (FileNotFoundException e) {
//			e.printStackTrace();
		} catch (IOException e) {
//			e.printStackTrace();
		}
		admin = new GeneralCacheAdministrator(prop);
	}
}
对应的配置文件为oscache_disk.properties:
cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
cache.path=/opt/myapp/cache
cache.algorithm=com.opensymphony.oscache.base.algorithm.FIFOCache
cache.capacity=1000
cache.unlimited.disk=true


public class ChatUserCache {
	private static GeneralCacheAdministrator admin = new GeneralCacheAdministrator();
}
此处采用默认的配置文件oscache.properties.

注意:如果多个cache实例产生的硬盘缓存路径和缓存名称完全相同,将会无法区分,此时要注意设置不同的key值区分。

关于NeedsRefreshException,引用官方文档中的一段例子如下:
// ---------------------------------------------------------------
// 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) {
	//This exception is thrown when retrieving an item from cache and it //is expired. Note that for fault tolerance purposes, it is possible //to retrieve the current cached object from the exception.
     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) {//获取myValue过程发生异常,无法执行到putInCache方法
         // 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);//解锁
     }
 }
这段代码是使用oscache的经典代码,细说如下。myValue = (String) admin.getFromCache(myKey, myRefreshPeriod);从对象缓存map中取出myKey对应的对象,两种情况可能发生: 一:如果myKey对应的对象存在(先前putInCache)并且没有过期(isStale()方法)那么getFromCache方法会正常返回。二:如果对应的对象不存在或者过期,分为两种情况:1)请求的线程第一个探测到对象不存在或者过期,那么这个时候oscache会抛出一个NeedRefreshException, 提示需要对数据进行一下刷新,怎么刷新,putInCache或者cancelUpdate即可。2)如果请求的线程并非第一个探测到对象不存在,两种情况:A.之前探测到的线程没有进行刷新处理,直接阻塞。B. 之前探测到的线程进行了刷新处理,抛出NeedRefreshException。3)如果请求的线程并非第一个探测到对象过期,两种情况:A.之前探测到的线程没有进行刷新处理,直接阻塞。B. 之前探测到的线程进行了刷新处理,又分两种情况:I.如果oscache.properties中对blocking设置为false(默认cache.blocking=false), 抛出NeedRefreshException,此处采取补救措施nre.getCacheContent(),会取出现有(很可能过期)内容。 II. 如果cache.blocking=true那么该线程会在此阻塞,直到putInCache在另一个线程中被调用或者是cancelUpdate被调用。参考以下说明:
cache.blocking
When a request is made for a stale cache entry, it is possible that another thread is already in the process of rebuilding that entry. This setting specifies how OSCache handles the subsequent 'non-building' threads. The default behaviour (cache.blocking=false) is to serve the old content to subsequent threads until the cache entry has been updated. This provides the best performance (at the cost of serving slightly stale data). When blocking is enabled, threads will instead block until the new cache entry is ready to be served. Once the new entry is put in the cache the blocked threads will be restarted and given the new entry.
Note that even if blocking is disabled, when there is no stale data available to be served threads will block until the data is added to the cache by the thread that is responsible for building the data.

补充:oscache对一个cacheEntry是否是Stale(或者说expire)的判断原则:
1.Cache.flushEntry()
2.Cache.flushAll()
3.CacheEntry.setGroups(groups); Cache.flushGroup(group)
4.createTime + refreshPeriod< now
5.cronExpiry< now
6.CacheEntry自带的EntryRefreshPolish的needRefresh方法返回true
上面的6条中的任何一条如果为true, 那么CacheEntry就是stale的,need refresh!
官方文档中的另一段例子如下:
// ---------------------------------------------------------------
// Typical use without 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);
         updated = true;
     } finally {
         if (!updated) {
             // It is essential that cancelUpdate is called if the
             // cached content could not be rebuilt
             admin.cancelUpdate(myKey);
         }
     }
 }
 // ---------------------------------------------------------------

分享到:
评论

相关推荐

    Hibernate OSCache缓存

    **Hibernate OSCache缓存详解** Hibernate 是一个流行的Java ORM(对象关系映射)框架,它允许开发者以面向对象的方式操作数据库。为了提高性能,Hibernate 提供了缓存机制,其中 OSCache 是一种广泛使用的二级缓存...

    OSCACHE网页缓存

    OSCACHE网页缓存.ppt ,页面cache

    OSCache需要的包

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

    OSCache学习例子 实例

    OSCache是开源的Java缓存解决方案,主要用于提高Web应用程序的性能和响应速度。它是由OpenSymphony团队开发的,能够缓存对象、SQL查询结果甚至整个页面,避免了频繁访问数据库或执行昂贵的计算,从而降低了系统负载...

    oscache-2.1.jar

    oscache-2.1.jar oscache-2.1.jar

    oscache缓存配置

    《osCache缓存配置详解》 osCache是Java平台上的一个高效、易用的缓存解决方案,它由Tuckey组织开发,广泛应用于各种Web应用中,以提高数据读取速度,减轻数据库压力。osCache的核心功能是提供了一个内存中的对象...

    Oscache框架的搭建步骤

    ### Oscache框架的搭建与应用详解 在现代Web开发中,缓存技术是提升系统响应速度、优化用户体验的关键策略之一。Oscache框架作为一种高效、灵活的缓存解决方案,在Java Web应用,尤其是JSP环境中,提供了强大的缓存...

    oscache缓存技术入门实例

    osCache 是一个开源的、基于Java的缓存框架,它为Java应用程序提供了高效且可配置的内存缓存功能。在本文中,我们将深入探讨osCache的基本概念、工作原理以及如何在实际项目中进行配置和使用。 一、osCache基本概念...

    OSCache配置说明文档

    总结预研结果,讨论OSCache在项目中的可行性,提出可能遇到的问题及解决方案,并为后续的集成和优化工作制定计划。 通过以上内容,读者应能深入理解OSCache的工作原理,熟练掌握其配置和使用,从而在实际项目中发挥...

    oscache详细配置文档

    OSCache 是一个强大的开源缓存解决方案,主要用于提升 Java Web 应用程序的性能。它能够缓存页面内容,减轻数据库压力,并减少服务器的资源消耗。本文将详细介绍 OSCache 的配置和使用方法。 **一、缓存整个页面** ...

    oscache-2.4.1-full

    - `readme.txt`:包含了关于如何安装、配置和使用OSCache的指南,以及可能的变更和注意事项。 - `www.pudn.com.txt`:可能是来源或者版权信息,也可能包含额外的说明或链接。 - `src`:源代码目录,对于开发者来...

    oscache处理

    - 配置osCache插件:首先需要将osCache的jar包添加到项目类路径中,然后在struts.xml配置文件中引入osCache拦截器,并配置相应的拦截规则。 2. **iBatis与osCache**: - iBatis是一个轻量级的持久层框架,它允许...

    oscache-java缓存框架

    osCache是Java开发中常用的缓存框架之一,它主要用于提高应用程序的性能和效率,通过将数据存储在内存中,减少对数据库的访问。osCache不仅可以用于Web应用,也可以用于任何Java应用程序,支持集群环境,提供了丰富...

    oscache的使用实例和详解

    **osCache:高效缓存框架详解与实例应用** osCache是一款流行且强大的Java缓存框架,主要用于提高应用程序的性能和响应速度。它通过将经常访问的数据存储在内存中,避免了反复读取数据库或计算数据的过程,从而显著...

    OsCache缓存框架使用示例

    OsCache是Java应用程序中常用的缓存框架,它能够有效地提高应用程序的性能,通过将经常访问的数据存储在内存中,减少对数据库或其他数据源的访问,从而降低系统负载。本示例将通过一个天气预报Web服务的场景,详细...

    oscache缓存技术

    **osCache缓存技术详解** osCache是一款广泛应用于Java应用程序中的开源缓存解决方案,由OpenSymphony团队开发。它提供了一种高效、可扩展的方式来管理应用程序中的数据缓存,从而提高系统的性能和响应速度。...

    oscache-2.2jar包

    osCache是Java平台上的一个开源缓存解决方案,主要用于提高应用程序的性能和响应速度。oscache-2.2jar包是该软件的一个版本,版本号为2.2。它包含了一系列的类和接口,用于实现内存中的对象缓存,从而减少对数据库或...

    oscache-2.1.1-full.zip_full_oscache_oscache 2_oscache2

    **osCache 2.1.1 全功能...总的来说,osCache 2.1.1 是一个强大且灵活的缓存解决方案,尤其适合需要高效缓存管理及分布式支持的Java项目。通过理解其核心特性和使用方法,开发者可以有效地提升应用性能并降低系统负载。

Global site tag (gtag.js) - Google Analytics