Java快取Ehcache-核心類和方法介紹及程式碼例項
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工程,將其放置在工程主目錄下的\target\classes資料夾下。然後在程式碼中新增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:\Users\xxxx\AppData\Local\Temp' 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:\Users\xxxx\AppData\Local\Temp\ehcache_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 ]
參考資料:
相關推薦
Java快取Ehcache-核心類和方法介紹及程式碼例項
Ehcache中核心類和方法 EhCache裡面有一個CacheManager型別,它負責管理cache。Cache裡面儲存著Element物件,Element必須是key-value對。Cache是實際物理實現的,在記憶體中或者磁碟。這些元件的邏輯表示就是下面即將要討論
Java中的日期類和方法
程式碼例項: import java.text.SimpleDateFormat; import java.util.Date; public class demo_date { public static void main(String[] args) { // TODO
深入分析Java反射(一)-核心類庫和方法
前提 Java反射的API在JavaSE1.7的時候已經基本完善,但是本文編寫的時候使用的是Oracle JDK11,因為JDK11對於sun包下的原始碼也上傳了,可以直接通過IDE檢視對應的原始碼和進行Debug。 本文主要介紹反射的基本概念以及核心類Class、Constructor、Method、Fie
初學Java——類和方法(2)繼承
修改 報告 實現 語句 現在 方式 繼承體系 調用父類 class a 1.繼承可以使你定義一個通用的類(父類),之後擴充該類為一個更加特定的類(子類)。 子類從父類中繼承可訪問的數據域和方法,還可以添加新的數據域和新方法。 語法:public class Subcla
java基礎-Integer類常用方法介紹
-i java基礎 font ger 版權 spa 責任 創作 bsp java基礎-Integer類常用方法介紹 作者:尹正傑 版權聲明:原創作品,謝絕轉載!否則將追究
Java基礎13-抽象類、方法和接口
會有 send 聲明 類的抽象 通過 撲克 重寫 基礎 來看 一、抽象類 1.什麽是抽象類? 讓我們先來看看百度是怎麽解釋的: 抽象類往往用來表征對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。 其實,類本身就是一種抽象概念,
java基礎之十三:Abstract類和方法
.get 引用 ava ESS 實現 print student 通過 bst 這篇介紹Java中抽象類和抽象方法,用關鍵字abstract表示抽象,是一個可以修飾類和方法的關鍵字。如果類名前面用abstract修飾,這個類就是抽象類。如果方法名稱前面有abstract修
java中的抽象類和抽象方法
抽象方法:在類中沒有方法體的方法,就是抽象方法。 抽象類:含有抽象方法的類就叫抽象類。 抽象類中的抽象方法必須被實現!如果一個子類沒有實現父類中的抽象方法,則子類也成為了一個抽象類!抽象類中的普通方法,可以不必實現。 1 用abstract關鍵字來修飾一個類時,這個類叫做抽象類;用abstr
JAVA阻止繼承:final類和方法
有時候,為了阻止人們利用某個類定義子類。不允許擴充套件的類被稱為final類。可以將類宣告為final類,也可以將方法設定為final方法,這樣子類就不能覆蓋父類的某個方法(將類宣告為final類只會將其中的所有的方法宣告為final方法)。 public final class A {
Java 的I/O中的類和方法講解
Java 的FILE類,以及常用方法 檔案和資料夾都是用File代表 建立一個檔案物件 使用絕對路徑或者相對路徑建立File物件 // 絕對路徑 File f1 = new File("d:/LOLFolder"); System
Servlet的簡單實現和核心類物件 方法
Servlet的實現和相關的方法 一、關於servlet servlet 是執行在 Web 伺服器中的小型 Java 程式。 servlet 通常通過 HTTP(超文字傳輸協議)接收和響應來自 Web 客戶端的請求。 要實現此介面,可以編
Java Http請求工具類和接收請求的方法
表面現像上面看看GET和POST的區別: 1.GET請求的資料會附在URL之後(就是把資料放置在HTTP協議頭中),以?分割URL和傳輸資料,引數之間以&相連,如:login.action?name=hyddd&password=idontknow&
Java面向物件-final類和final方法、final變數(常量)
為什麼得需要使用final修飾符 繼承關係最大的弊端是破壞封裝:子類能訪問父類的實現細節,而且可以通過方法覆蓋的形式修改實現細節。 final本身的含義是“最終的,不可改變的”,它可以修飾抽象類,非抽象方法和變數。 注意:構造方法不能使用final修飾,因
Android NDK(JNI)學習總結一:Java程式碼中申明native函式-Java呼叫C函式,並在C函式中訪問java類和方法、屬性
本文不涉及android-ndk開發環境搭。 步驟一:新建一個APP,名稱為HelloJNI,然後定義一個類(將會在native程式碼中呼叫和訪問該類): package com.example.hellojni; public class JNITe
java動態載入jar包,並執行其中的類和方法
動態載入jar包,在實際開發中經常會需要用到,尤其涉及平臺和業務的關係的時候,業務邏輯部分可以獨立出去交給業務方管理,業務方只需要提供jar包,就能在平臺上執行。 下面通過一個例項來直觀演示: 第一:定義一個抽象類 AbstractAction (稍後換成介面的例項) pa
Java Character 類 和 方法
Character 類用於對單個字元進行操作。 Character 類在物件中包裝一個基本型別 char 的值 例項 char ch = 'a'; // Unicode 字元表示形式 char uniChar = '\u039A'; // 字元陣
Hibernate核心類和介面詳細介紹
一、hiobernate核心類和介面預覽圖 二、hibernate.properties 這個檔案是以前老版本使用的 類似於hibernate.cfg.xml檔案;作用和hibernate.cfg.xml一致. 三、hibernate.cfg.xml (1)詳細介紹
為何java裡的Thread類的方法suspend()和resume()不推薦使用?
官方解釋如下:http://download.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.htmlWhy are Thread.suspend and Th
java反射呼叫指定jar包中的類和方法
需求:動態載入jar包,例項化jar包中的類,並呼叫類中的方法 已知:jar包所在路徑和jar包名稱,類名已知,類繼承的抽象類可以被引入,類中的方法已知 實現方法: 1. 手動呼叫類載入器動態載入jar包; 2. 應用java中的反射例項化類,得到類的一個例項; 3. 運
Hibernate中的五大核心類和接口
session 回滾 開啟事務 核心 避免 事務 提交 jdbc 一級緩存 Hibernate中的五大核心類和接口 Configuration(類) : 加載配置文件hibernate.cfg.xml文件中的配置信息,從而得到: 1).hibernate的