import
java.util.Collection;
import
java.util.Collections;
import
java.util.Iterator;
import
java.util.List;
import
java.util.Map;
import
java.util.concurrent.ConcurrentHashMap;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Component;
import
net.blogjava.frankiegao123.log.slf4j.Log;
import
net.blogjava.frankiegao123.log.slf4j.LogFactory;
/**
* <p>System.Config 配置缓存</p>
*
* @author frankiegao123
* 2010-6-10 下午02:48:35
*/
@Component
(
"configCache"
)
public
class
ConfigCache
implements
ConfigService {
private
final
static
Log log = LogFactory.getLog(ConfigCache.
class
);
/**
* 更新缓存时记录的时间
*/
private
volatile
long
time = 0L;
/**
* 正在更新缓存时的门闩,为 true 时表示当前没有更新缓存,为 true 时表示当前正在更新缓存
*/
private
volatile
boolean
updateGate =
true
;
/**
* 缓存容器
*/
private
Map<String, SysConfig> cache =
new
ConcurrentHashMap<String, SysConfig>();
private
CommonDao commonDao;
@Autowired
public
ConfigCache(CommonDao commonDao) {
this
.commonDao = commonDao;
log.info(
"initializing cache..."
);
refreshCache();
time = System.currentTimeMillis();
log.info(
"initialized cache finished, cache size: {}, set cache time to current: {}, cache timeout: {}ms"
, cache.size(), time, ConfigConstant.CACHE_TIMEOUT);
}
/**
* <p>根据配置的键名获取配置值</p>
*
* @param configKey
* @return
* @author frankiegao123
* 2010-6-10 上午11:18:33
*/
public
SysConfig getSysConfig(String configKey) {
long
current = System.currentTimeMillis();
if
(updateGate && isTimeout(current)) {
synchronized
(
this
) {
if
(updateGate) {
timeoutSynRefresh(current);
}
}
}
return
cache.get(configKey);
}
/**
* <p>超时时更新缓存。该方法需要在同步环境中调用</p>
* @param current
* @author frankiegao123
* 2010-6-10 上午11:16:30
*/
private
void
timeoutSynRefresh(
long
current) {
updateGate =
false
;
log.info(
"refresh cache start..., time out: {}, size: {}, set updateGate to false"
, (current - time) /
1000.0
, cache.size());
try
{
refreshCache();
time = current;
log.info(
"refresh cache finished, size after update: {}, set cache time to current: {}"
, cache.size(), String.valueOf(time));
}
catch
(Exception e) {
log.error(
"refresh cache failed"
, e);
}
finally
{
updateGate =
true
;
log.info(
"refresh cache finished, set updateGate to true"
);
}
}
/**
* <p>更新缓存数据</p>
*
* @author frankiegao123
* 2010-6-10 上午11:15:55
*/
private
void
refreshCache() {
List<SysConfig> configs = commonDao.getSysConfigs();
for
(Iterator<SysConfig> i = configs.iterator(); i.hasNext(); ) {
SysConfig config = i.next();
cache.put(config.getKey(), config);
}
commonDao.clear();
SysConfig config = cache.get(SysConfig.TEST_KEY);
if
(config ==
null
) {
log.error(
"refresh cache, cannot find TEST_KEY"
);
}
else
{
log.info(
"refresh cache, find TEST_KEY = [{}]"
, config.getValue());
}
}
/**
* <p>缓存是否超时</p>
*
* @param current
* @return
* @author frankiegao123
* 2010-6-10 上午11:16:12
*/
private
boolean
isTimeout(
long
current) {
return
(current - time >= ConfigConstant.CACHE_TIMEOUT);
}
Collection<SysConfig> getSysConfigs() {
return
Collections.unmodifiableCollection(cache.values());
}
int
getSize() {
return
cache.size();
}
long
getTime() {
return
time;
}
boolean
isUpdateGate() {
return
updateGate;
}
void
refresh() {
time = 0L;
log.info(
"refresh: reset cache time to 0"
);
getSysConfig(
"none"
);
log.info(
"refresh: refresh cache finished, cache: {0}"
, String.valueOf(time));
}
}
相关推荐
在这个“Java缓存技术的使用实例”中,我们将深入探讨Java缓存的实现、工作原理以及如何部署和运行示例代码。 首先,让我们理解什么是缓存。缓存是一种存储机制,用于临时存储常用或最近使用的数据,以便快速访问。...
java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例
Ehcache是一款广泛使用的开源Java缓存框架,尤其在处理大量数据时,它可以显著提升应用程序的效率。本文将深入探讨Ehcache在实际应用中的实例。 一、Ehcache简介 Ehcache是由Terracotta公司开发的高性能、易用的...
Cache 缓存类存放缓存id 缓存更新时间 缓存资源(object)缓存是否可用 CacheManager 缓存管理类有缓存各种操作的方法 以上两个为主要类 下面为测试类 TestCache main方法测试缓存 TestBo 需要存入缓存的资源
以下是关于 Memcached 缓存系统、Java 缓存框架以及实例代码的详细说明: 1. **Memcached 基础** - **Cache 定义**:Cache 通常被用来协调不同速度设备之间的数据传输,包括硬件级别的 CPU Cache 和软件层面的...
总的来说,"基于Java的实例源码-Java缓存工具 SimpleCache.zip"是一个宝贵的教育资源,为Java开发者提供了实际操作缓存机制的机会,从而提升他们的技能和理解,对于那些希望优化应用程序性能或构建高效服务的开发者...
基于Java的实例开发源码-Java缓存工具 SimpleCache.zip
3. **缓存管理器(CacheManager)**:负责创建和管理多个缓存实例。它是线程安全的,全局唯一的。 4. **缓存区域(Cache Regions)**:在EhCache中,不同的数据可以被分配到不同的缓存区域,便于管理和配置。 5. *...
在这个"hibernate二级缓存实例"中,我们将深入探讨二级缓存的原理、配置以及在实际项目中的应用。 首先,我们需要了解一级缓存和二级缓存的区别。一级缓存是Session级别的,每个Session都有自己的一级缓存,用于...
深入理解Java缓存技术可以帮助我们设计出更加高效、响应迅速的系统。在这个主题下,我们将探讨Java缓存的基本概念、常用框架以及实现策略。 首先,让我们了解什么是缓存。缓存是一种存储技术,它允许我们在短时间内...
在Java的持久化框架Hibernate中,缓存机制是优化数据库操作性能的重要手段。本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始...
1. **缓存初始化**:创建Map实例,可以是HashMap、ConcurrentHashMap或其他适合并发访问的实现,根据实际需求选择。 2. **缓存加载**:当请求的数据不在缓存中时,从其他数据源(如数据库、网络请求)获取并添加到...
**Spring+EhCache缓存实例详解** 在现代的Java企业级应用中,缓存技术扮演着至关重要的角色,它能够显著提升系统性能,减少数据库负载。Spring框架与EhCache的结合,为开发者提供了一种高效、易用的缓存解决方案。...
EhCache是一个高性能、易用的Java本地缓存框架,被广泛应用于许多Java应用程序中,以提高数据访问速度,减轻数据库负载。它提供了一个简单但功能强大的API,使得开发者能够轻松地集成到他们的项目中。在Java应用中,...
**Lucene 全文搜索引擎实例:Java Lucene 实例** Lucene 是 Apache 软件基金会的一个开源项目,它提供了一个高性能、可扩展的信息检索库。这个实例将深入讲解如何在 Java 中使用 Lucene 来创建索引并执行各种搜索...
本篇将深入探讨Spring缓存实例,基于给出的博客链接(http://blog.csdn.net/maoyeqiu/article/details/50433934)和文件"20140527demoSpringCache",我们将全面解析Spring缓存的使用方法和实践场景。 首先,Spring...
EhCache则是一个广泛使用的Java缓存解决方案,它可以减少数据库查询的频率,提高应用程序响应速度。EhCache支持内存和磁盘存储,并且可以配置为分布式缓存系统。它提供了丰富的API,方便开发者进行缓存操作。 接...
总的来说,Java缓存的应用是提升系统性能的关键策略之一。了解Java内存体系和有效使用缓存框架,能够帮助开发者创建更高效、更稳定的系统,同时避免因内存管理不当导致的问题。正确设置JVM内存参数和使用内存检查...
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。 下图是 Ehcache 在应用程序中的位置: 主要的特性有: 1. 快速.2. 简单.3. 多种缓存策略4. 缓存数据有两级:...
### Java缓存理解 #### 一、Java缓存机制概览 在软件开发过程中,缓存是一种非常重要的优化手段,它能够显著提升系统的性能和响应速度。Java平台提供了多种缓存解决方案,其中Ehcache是一种广泛应用且功能强大的...