日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

新的Java缓存标准(javax.cache)

發(fā)布時(shí)間:2023/12/3 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 新的Java缓存标准(javax.cache) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
這篇文章探討了新的Java緩存標(biāo)準(zhǔn):javax.cache。

它如何適應(yīng)Java生態(tài)系統(tǒng)

該標(biāo)準(zhǔn)由JSR107開發(fā),作者是共同規(guī)范負(fù)責(zé)人。 JSR107包含在JSR342開發(fā)的Java EE 7中。 Java EE 7將于2012年底完成。但是與此同時(shí),javax.cache將在Java SE 6和更高版本以及Java EE 6環(huán)境以及Spring和其他流行環(huán)境中運(yùn)行。

JSR107具有草稿狀態(tài)。 目前,我們的API版本為0.3,參考實(shí)現(xiàn)和TCK。 本文中的代碼示例對(duì)此版本適用。

采用

作為專家組的活躍成員或?qū)?shí)施規(guī)范感興趣的供應(yīng)商是:

  • 兵馬俑– Ehcache
  • Oracle –一致性
  • JBoss – Infinispan
  • IBM – ExtemeScale
  • SpringSource – Gemfire
  • 電網(wǎng)增益
  • 最高溫度
  • Google App Engine Java

Terracotta將為Ehcache發(fā)布一個(gè)模塊,使其與最終草案一致,然后在最終版本需要時(shí)對(duì)其進(jìn)行更新。

特征

從設(shè)計(jì)的角度來看,基本概念是CacheManager,用于保存和控制Cache的集合。 緩存具有條目。 基本的API可以像地圖一樣具有以下附加功能:

  • 原子操作,類似于java.util.ConcurrentMap
  • 直讀緩存
  • 直寫式緩存
  • 緩存事件監(jiān)聽器
  • 統(tǒng)計(jì)
  • 交易,包括所有隔離級(jí)別
  • 緩存注釋
  • 具有定義的鍵和值類型的通用緩存
  • 按引用定義存儲(chǔ)(僅適用于堆緩存)和按值存儲(chǔ)

可選功能

我們沒有采用針對(duì)不同用戶群體(例如Java SE和Spring / EE)的規(guī)范,而是采用了不同的方法。

首先,對(duì)于Java SE樣式緩存,沒有依賴性。 對(duì)于可能要使用批注和/或事務(wù)的Spring / EE,這些框架將滿足相關(guān)性。

其次,我們通過ServiceProvider.isSupported(OptionalFeature功能)具有功能API,因此您可以在運(yùn)行時(shí)確定實(shí)現(xiàn)的功能。 可選功能包括:

  • storeByReference-storeByValue是默認(rèn)值
  • 交易性的
  • 注解

這使得實(shí)現(xiàn)有可能在不必支持所有功能的情況下支持規(guī)范,并允許最終用戶和框架發(fā)現(xiàn)功能是什么,以便他們可以動(dòng)態(tài)配置適當(dāng)?shù)挠梅ā?

適用于獨(dú)立和分布式緩存

盡管該規(guī)范沒有規(guī)定特定的分布式緩存拓?fù)?#xff0c;但是可以意識(shí)到緩存很可能是分布式的。 我們有一個(gè)API涵蓋了這兩種用法,但它對(duì)分布式問題很敏感。 例如,CacheEntryListener具有偵聽事件的NotificationScope,因此可以將事件限制為本地傳遞。 我們沒有像keySet()和values()這樣的網(wǎng)絡(luò)成本高的映射方法。 而且,我們通常更喜歡零或低成本回報(bào)類型。 因此,雖然Map具有V put(K鍵,V值),但是javax.cache.Cache具有void put(K鍵,V值)。
類加載

緩存包含由多個(gè)線程共享的數(shù)據(jù),這些線程本身可能正在一個(gè)JVM中的不同容器應(yīng)用程序或OSGi捆綁軟件中運(yùn)行,并且可能分布在集群中的多個(gè)JVM中。 這使類加載變得棘手。

我們已經(jīng)解決了這個(gè)問題。 創(chuàng)建CacheManager時(shí),可以指定類加載器。 如果未指定,則實(shí)現(xiàn)將提供默認(rèn)值。 無論哪種方式,對(duì)象反序列化都將使用CacheManager的類加載器。

與使用后備方法的Ehcache這樣的緩存所采用的方法相比,這是一個(gè)很大的改進(jìn)。 首先使用線程的上下文類加載器,然后失敗,然后嘗試另一個(gè)類加載器。 可以使它在大多數(shù)情況下都有效,但會(huì)遇到一些麻煩,并且因?qū)崿F(xiàn)方式而有很大差異。

獲取代碼

該規(guī)范位于Maven中心。 Maven代碼段是:

<dependency><groupId>javax.cache</groupId><artifactId>cache-api</artifactId><version>0.3</version> </dependency>

庫克API之旅

創(chuàng)建一個(gè)CacheManager

我們支持Java 6 java.util.ServiceLoader創(chuàng)建方法。 它將自動(dòng)檢測您的類路徑中的緩存實(shí)現(xiàn)。 然后,使用以下命令創(chuàng)建一個(gè)CacheManager:

CacheManager cacheManager = Caching.getCacheManager();

它返回一個(gè)名為“ __default__”的單例CacheManager。 后續(xù)調(diào)用返回相同的CacheManager。

CacheManager可以在其中配置名稱和類加載器。

CacheManager cacheManager =Caching.getCacheManager("app1", Thread.currentThread().getContextClassLoader());

實(shí)現(xiàn)也可能支持直接創(chuàng)建新的功能,以實(shí)現(xiàn)最大的靈活性:

CacheManager cacheManager =new RICacheManager("app1", Thread.currentThread().getContextClassLoader());

或做同樣的事情而不在任何特定實(shí)現(xiàn)上增加編譯時(shí)間依賴項(xiàng):

String className = "javax.cache.implementation.RIServiceProvider"; Class<ServiceProvider> clazz =(Class<ServiceProvider>)Class.forName(className); ServiceProvider provider = clazz.newInstance(); return provider.createCacheManager(Thread.currentThread().getContextClassLoader(), "app1");

我們希望實(shí)現(xiàn)具有自己的知名配置文件,這些文件將用于配置CacheManager。 CacheManager的名稱可用于區(qū)分配置文件。 對(duì)于ehcache,這將是熟悉的ehcache.xml,它位于類路徑的根目錄,并帶有CacheManager名稱的連字符前綴。 因此,默認(rèn)的CacheManager將僅是ehcache.xml,而“ myCacheManager”將是app1-ehcache.xml。

創(chuàng)建一個(gè)緩存

該API支持以編程方式創(chuàng)建緩存。 這補(bǔ)充了通常由聲明式配置緩存的約定,這些約定留給每個(gè)供應(yīng)商。

以編程方式配置名為“ testCache”的緩存,該緩存設(shè)置為可讀取

cacheManager = getCacheManager(); CacheConfiguration cacheConfiguration = cacheManager.createCacheConfiguration(); cacheConfiguration.setReadThrough(true); Cache testCache = cacheManager.createCacheBuilder("testCache").setCacheConfiguration(cacheConfiguration).build();

獲取對(duì)緩存的引用

您可以從CacheManager獲得緩存。 獲取名為“ testCache”的緩存:

Cache<Integer, Date> cache = cacheManager.getCache("testCache");

基本緩存操作

放入緩存:

Cache<Integer, Date> cache = cacheManager.getCache(cacheName); Date value1 = new Date(); Integer key = 1; cache.put(key, value1);

要從緩存中獲取:

Cache<Integer, Date> cache =cacheManager.getCache(cacheName); Date value2 = cache.get(key);

要從緩存中刪除:

Cache<Integer, Date> cache =cacheManager.getCache(cacheName); Integer key = 1; cache.remove(key);

注解

JSR107引入了一組標(biāo)準(zhǔn)化的緩存注釋,它們對(duì)在依賴項(xiàng)注入容器中運(yùn)行的帶注釋的類進(jìn)行方法級(jí)別的緩存攔截。 緩存注釋正變得越來越流行,從Spring的Ehcache注釋開始,然后影響了Spring 3的緩存注釋。

JSR107批注涵蓋了最常見的緩存操作,包括:

  • @CacheResult –使用緩存
  • @CachePut –放入緩存
  • @CacheRemoveEntry –從緩存中刪除單個(gè)條目
  • @CacheRemoveAll –從緩存中刪除所有條目

當(dāng)可以輸入所需的高速緩存名稱,鍵和值時(shí),它們不是必需的。 有關(guān)詳細(xì)信息,請(qǐng)參見JavaDoc。 為了更好地控制,您可以指定所有這些以及更多。 在以下示例中,將cacheName屬性指定為“ domainCache”,將index指定為鍵,將domain指定為值。

public class DomainDao {@CachePut(cacheName="domainCache")public void updateDomain(String domainId, @CacheKeyParam int index,@CacheValue Domain domain) {...} }

參考實(shí)現(xiàn)包括Spring和CDI的實(shí)現(xiàn)。 CDI是Java EE 6中引入的標(biāo)準(zhǔn)化容器驅(qū)動(dòng)的注入。該實(shí)現(xiàn)已很好地模塊化以實(shí)現(xiàn)重用,并使用Apache許可證,因此,我們希望多個(gè)開源緩存可以重用它們。 盡管我們尚未完成Guice的實(shí)現(xiàn),但這很容易做到。

注釋示例

此示例說明如何使用注釋使高速緩存與基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)(在本例中為Blog Manager)保持同步,以及如何使用高速緩存來加快響應(yīng)(通過@CacheResult完成)

public class BlogManager {@CacheResult(cacheName="blogManager")public Blog getBlogEntry(String title) {...}@CacheRemoveEntry(cacheName="blogManager")public void removeBlogEntry(String title) {...}@CacheRemoveAll(cacheName="blogManager")public void removeAllBlogs() {...}@CachePut(cacheName="blogManager")public void createEntry(@CacheKeyParam String title, @CacheValue Blog blog) {...}@CacheResult(cacheName="blogManager")public Blog getEntryCached(String randomArg, @CacheKeyParam String title){...}}

接線彈簧

對(duì)于Spring,關(guān)鍵是以下配置行,該行將緩存注釋攔截器添加到Spring上下文中:

<jcache-spring:annotation-driven proxy-target-class="true"/>

一個(gè)完整的例子是:

<beans><context:annotation-config/><jcache-spring:annotation-driven proxy-target-class="true"/><bean id="cacheManager" factory-method="getCacheManager" /> </beans>

基于JSR107貢獻(xiàn)者Eric Dalquist的早期工作,Spring具有自己的緩存注釋。 這些注釋和JSR107將愉快地共存。

連接CDI

首先創(chuàng)建javax.cache.annotation.BeanProvider的實(shí)現(xiàn),然后告訴CDI在/ META-INF / services /的類路徑中聲明一個(gè)名為javax.cache.annotation.BeanProvider的資源在哪里找到。

有關(guān)使用CDI的Weld實(shí)現(xiàn)的示例,請(qǐng)參見CDI測試工具中的CdiBeanProvider 。

進(jìn)一步閱讀

要進(jìn)一步閱讀,請(qǐng)?jiān)L問位于https://github.com/jsr107/jsr107spec的JSR主頁。

參考: javax.cache:我們的JCG合作伙伴 Greg Luck在Greg Luck的Blog上發(fā)布 的新Java緩存標(biāo)準(zhǔn) 。

相關(guān)文章 :
  • Spring 3.1緩存抽象教程
  • Java EE6 CDI,命名組件和限定符
  • JBoss 4.2.x Spring 3 JPA Hibernate教程
  • JBoss 4.2.x Spring 3 JPA Hibernate教程第2部分
  • Java教程和Android教程列表

翻譯自: https://www.javacodegeeks.com/2011/10/new-java-caching-standard-javaxcache.html

總結(jié)

以上是生活随笔為你收集整理的新的Java缓存标准(javax.cache)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。