Java緩存Ehcache-核心類和方法介紹及使用實例
來源:程序員人生 發布時間:2014-10-11 08:00:00 閱讀次數:4629次
Ehcache中核心類和方法
EhCache里面有一個CacheManager類型,它負責管理cache。Cache里面存儲著Element對象,Element必須是key-value對。Cache是實際物理實現的,在內存中或者磁盤。這些組件的邏輯表示就是下面即將要討論的類。他們的方法提供了可編程的訪問方式。
CacheManager
負責Cache的創建、訪問、移除。
CacheManager創建
CacheManager支持兩種創建模式:單例(Singleton mode)和實例(InstanceMode)。
在2.5之前的版本中,在同一個JVM中允許存在任意數量相同名字的CacheManager。每調用new CacheManager(...)一次,就會產生一個新的CacheManager實例,而不管已經存在多少個。調用CacheManager.create(...),則返回的是已經存在的那個配置對應的單例CacheManager,如果不存在,則創建一個。
2.5之后的版本,不允許在同一個JVM內存在多個具有相同名字的CacheManager。創建非單例實例的CacheManager()構造函數可能會打破這一規則,但是會拋出NPE異常。如果你的代碼要在同一個JVM創建多個同名的實例,請使用靜態方法CacheManager.create(),總是返回對應名的CacheManager(如果已經存在),否則創建一個。
事實上,我們可以直接利用Spring中的EhCacheManagerFactoryBean[spring2.5.4]來幫我們完成CacheManager的創建,看看它的具體創建方式:
if (this.shared) {
// Shared CacheManager singleton at the VM level.
if (this.configLocation != null) {
this.cacheManager = CacheManager.create(this.configLocation.getInputStream());
}
else {
this.cacheManager = CacheManager.create();
}
}
else {
// Independent CacheManager instance (the default).
if (this.configLocation != null) {
this.cacheManager = new CacheManager(this.configLocation.getInputStream());
}
else {
this.cacheManager = new CacheManager();
}
}
if (this.cacheManagerName != null) {
this.cacheManager.setName(this.cacheManagerName);
}
EhCache2.5.2及其以上版本的創建方法歸納如下:
- CacheManager.newInstance(Configuration configuration) :創建一個新的CacheManager 對象或者返回已經存在的對應配置中名字的CacheManager
- CacheManager.create():創建一個新的默認配置的單例CacheManager ,或者返回一個已經存在的單例。
- CacheManager.create(Configuration configuration),創建一個對應傳入配置文件中名字的單例CacheManager,或者返回已經存在的單例CacheManager。
- new CacheManager(Configuration configuration),創建一個新的CacheManager,或者如果對應配置的CacheManager已經存在或配置參數為空,拋出異常。
在Instance Mode中,如果Cache均使用MemoryStore,則沒有什么特別需要注意的。但是如果使用了DIskStore,那么每個CacheManager必須具有不同的diskStore路徑。當一個新的CacheManager被創建的時候,需要檢查沒有別的CacheManager使用同樣的DiskStore路徑。如果有,就會拋出異常CacheException。如果CacheManager是集群中一部分,那么其監聽端口必須唯一。
Singletonmode和Instance Mode可以混合使用,而不會產生沖突。
Ehcache
所有的cache都實現了接口Ehcache。每個cache都有名字和屬性,且包含Element。
Ehcache中的cache相當于其他緩存系統中的一塊緩存區域。
Element
Element是存放于cache中的原子單位。它有一個key、一個value以及關于訪問的記錄。Element被放進到cache或者從cache移除。他們也可能會由于過期被移除,這依賴于配置。
使用實例
下面給出了一個使用Ehcache的實際例子。
首先新建一個maven java工程,在pom.xml中添加Ehcache依賴。
<!-- Ehcache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.8.3</version>
</dependency>
下面是java代碼。代碼實現的功能非常簡單,即創建CacheManager,往里面存放一個Cache,然后往cache里面存數據和取數據,目的是展示Ehcache的基本使用。
/**
* XXX.com Inc.
* Copyright (c) 2004-2014 All Rights Reserved.
*/
package com.test.encache;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
/**
*
* @author XXX
* @version $Id: EncacheTest.java, v 0.1 2014年8月8日 下午5:30:03 XXX Exp $
*/
public class EncacheTest {
//一些配置參數
//private final static String configFileName = "ehcache.xml";
//private final static int maxEntriesLocalHeap = 1000;
private static CacheManager cacheManager;
static String cacheName = "cache1";
public static void main(String[] args) {
ehcacheSetUp();
ehcacheUse();
}
private static void ehcacheSetUp() {
cacheManager = CacheManager.create();
//CacheConfiguration configuration = new CacheConfiguration(configFileName,
// maxEntriesLocalHeap);
//Cache cache = new Cache(configuration);
cacheManager.addCache(cacheName);
}
private static void ehcacheUse() {
Cache cache1 = cacheManager.getCache(cacheName);
String key = "key1";
String value = "value1";
writeSomeData(cache1, key, value);
Element element = readSomeData(cache1, key, value);
System.out.println(element);
}
private static void writeSomeData(Cache cache, String key, String value) {
cache.put(new Element(key, value));
}
private static Element readSomeData(Cache cache, String key, String value) {
return cache.get(key);
}
}
程序輸出:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
[ key = key1, value=value1, version=1, hitCount=1, CreationTime = 1411807398768, LastAccessTime = 1411807398771 ]
其中的錯誤信息是因為沒有配置日志相關的SLF4J所致。
下面我們要配置日志。首先在pom.xml中添加依賴:
<!-- SLF4J -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
然后建立log4j的配置文件log4j.properties:
# Root logger option
log4j.rootLogger=INFO, file, stdout
log4j.logger.com.test.encache.EncacheTest=INFO,file
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=C:logging.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
并且將這個文件放置到工程的classpath下,在這里我建立的是用Eclipse創建的maven工程,將其放置在工程主目錄下的 argetclasses文件夾下。
然后在代碼中添加logger的初始化代碼:
private static final Logger logger = LoggerFactory.getLogger(EncacheTest.class);
然后就可以使用了:
logger.info("Setup ehcache");
輸出:
2014-09-27 17:22:45 INFO EncacheTest:35 - Setup ehcache
2014-09-27 17:22:45 WARN ConfigurationFactory:136 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/D:/MavenRepo/net/sf/ehcache/ehcache/2.8.3/ehcache-2.8.3.jar!/ehcache-failsafe.xml
2014-09-27 17:22:46 WARN DiskStorePathManager:162 - diskStorePath 'C:Usersxiajun.xjAppDataLocalTemp' is already used by an existing CacheManager either in the same VM or in a different process.
The diskStore path for this CacheManager will be set to C:Usersxiajun.xjAppDataLocalTempehcache_auto_created7989392067865891865diskstore.
To avoid this warning consider using the CacheManager factory methods to create a singleton CacheManager or specifying a separate ehcache configuration (ehcache.xml) for each CacheManager instance.
[ key = key1, value=value1, version=1, hitCount=1, CreationTime = 1411809766273, LastAccessTime = 1411809766276 ]
參考資料:
源文檔 <http://ehcache.org/documentation/get-started/key-classes-methods>
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈