生活随笔
收集整理的這篇文章主要介紹了
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的創建,看看它的具體創建方式:
[java]?view plaincopyprint?
if?(this.shared)?{?? ?????????????? ????????????if?(this.configLocation?!=?null)?{?? ????????????????this.cacheManager?=?CacheManager.create(this.configLocation.getInputStream());?? ????????????}?? ????????????else?{?? ????????????????this.cacheManager?=?CacheManager.create();?? ????????????}?? ????????}?? ????????else?{?? ?????????????? ????????????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依賴。
[html]?view plaincopyprint?
?? <dependency>?? ????<groupId>net.sf.ehcache</groupId>?? ????<artifactId>ehcache</artifactId>?? ????<version>2.8.3</version>?? </dependency>?? 下面是java代碼。代碼實現的功能非常簡單,即創建CacheManager,往里面存放一個Cache,然后往cache里面存數據和取數據,目的是展示Ehcache的基本使用。
[java]?view plaincopyprint?
? ? ? ?? package?com.test.encache;?? ?? import?net.sf.ehcache.Cache;?? import?net.sf.ehcache.CacheManager;?? import?net.sf.ehcache.Element;?? ?? ? ? ? ? ?? public?class?EncacheTest?{?? ?????? ?????? ?????? ????private?static?CacheManager?cacheManager;?? ????static?String???????????????cacheName?=?"cache1";?? ?? ????public?static?void?main(String[]?args)?{?? ????????ehcacheSetUp();?? ?? ????????ehcacheUse();?? ????}?? ?? ????private?static?void?ehcacheSetUp()?{?? ?? ????????cacheManager?=?CacheManager.create();?? ?? ?????????? ?????????? ?? ?????????? ????????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);?? ????}?? }?? 程序輸出: [html]?view plaincopyprint?
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中添加依賴:
[html]?view plaincopyprint?
?? <dependency>?? ????<groupId>org.slf4j</groupId>?? ????<artifactId>slf4j-log4j12</artifactId>?? ????<version>1.6.1</version>?? ;/dependency>?? 然后建立log4j的配置文件log4j.properties:
[plain]?view plaincopyprint?
#?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的初始化代碼: [java]?view plaincopyprint?
private?static?final?Logger?logger????=?LoggerFactory.getLogger(EncacheTest.class);?? 然后就可以使用了:
[java]?view plaincopyprint?
logger.info("Setup?ehcache");??
輸出:
[html]?view plaincopyprint?
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?] ?
總結
以上是生活随笔為你收集整理的Ehcache中核心类和方法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。