1. 程式人生 > >Java快取Ehcache-核心類和方法介紹及程式碼例項

Java快取Ehcache-核心類和方法介紹及程式碼例項

Ehcache核心類和方法

EhCache裡面有一個CacheManager型別,它負責管理cacheCache裡面儲存著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是叢集中一部分,那麼其監聽埠必須唯一。

SingletonmodeInstance 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面向物件-finalfinal方法、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的