Ehcache 3.7文檔—基礎篇—XML Configuration

来源:https://www.cnblogs.com/Sicwen/archive/2019/03/24/10588047.html
-Advertisement-
Play Games

你可以使用xml配置創建CacheManager,根據這個schema definition ( http://www.ehcache.org/documentation/3.7/xsds.html#core ) 一. 配置元素 <config> 根元素 config是我們xml配置文件的根元素。它 ...


你可以使用xml配置創建CacheManager,根據這個schema definition ( http://www.ehcache.org/documentation/3.7/xsds.html#core )

一. 配置元素

<config> 根元素

config是我們xml配置文件的根元素。它代表了CacheManager的配置。

註意:Ehcache允許創建多個CacaheManager使用相同的XML配置文件。與JSR-107 javax.cache.spi.CachingProvider相對比,Ehcache不維護已創建的CacheManager的實例。

 

<service>元素

service元素是CacheManager所管理服務的擴展點。

用這種方式定義的service他的生命周期和管理他的CacheManger生命周期一樣。對於這樣的service,當CacheManager.init被調用時會觸發Service.start方法。當CacheManger.close被調用時會觸發Service.stop方法。

CacaheManger管理的那些Cache可以使用這些Service的實例。

JSR-107使用XML配置的擴展點在[ http://www.ehcache.org/documentation/3.7/107.html#supplement-jsr-107-configurations ]這裡有介紹。

 

<default-serializers>元素

default-serializers元素代表了CacheManger級別的序列化配置。它是<serializer>元素的集合,<serializer>元素包含了一個type和Serializer類的全限定名。

 

<default-copiers>元素

default-copiers元素代表了CacheManger級別的Copiers配置,它是<copier>元素的集合,<copier>元素包含了一個type和Copier類的全限定名。

 

<persistence>元素

persistence元素代表了持久化,當創建PersistentCacheManager時使用它。它包含一個數據存儲到Disk時的目錄。

 

<cache>元素

一個cache元素代表一個Cache實例,這個實例被CacheManager創建並管理。每個cache元素需要一個alias屬性,根據這個alias屬性去調用org.ehcache.CacheManager.getCache(String,Class<K>,Class<V>),獲得相應的cache實例。也可以使用uses-template屬性去引用一個<cache-template>。瞭解詳情參見[ http://www.ehcache.org/documentation/3.7/xml.html#cache-template-elements ]

如下元素是可選的:

  • <key-type>: Cache<K,V>中K的全限定類名,預設是java.lang.Object
  • <value-type>: Cache<K,V>中V的全限定類名,預設是java.lang.Object
  • <expiry>: 控制expiry的類型和他的參數
  • <eviction-advisor>: 實現org.ehcache.config.EvictionAdvisor<K,V>類的全限定名,預設是null
  • <integration>: 用於配置cache-through模式的CacheLoaderWriter
  • <resources>: 配置層的信息和層的容量,當只是用heap層時,你可以使用<heap>元素代替它

 

<cache-template>元素

cache-template元素是<cache>元素的模板,它具有唯一性,可以通過name屬性設置名字。cache元素通過使用uses-template屬性指定cache-template的名字可以繼承該模板中所有的屬性值。當然<cache>也可以重寫模板中的屬性。

註意:Processing of cache template configurations can be triggered lazily by actions that dynamically bind new caches to existing cache templates. Errors within such templates may not be revealed until this lazy processing is triggered.

 

二. XML配置文件中屬性替換

在XML配置文件內部可以引用java system properties值,在配置解析時這些引用會被替換為value。

使用的語法格式為${prop.name},他可以用在所有attributes和elements的值上,目前這個規則不包含用來調整大小的數字和標識符,例如cache和cache-template的名字。

註意:如果這個系統屬性不存在,那麼會導致配置解析失敗。

一個典型的應用是在<persistence>標簽中的directory屬性上,配置file路徑

<persistence directory="${user.home}/cache-data"/>(1)

這裡的user.home將會被系統中的屬性替換,比如說替換成/home/user

 

三. XML配置解析

如果你能通過JSP-107API獲取CacheManager,當你在調用javax.cache.spi.CachingProvider.getCacheManager(java.net.URI,java.lang.ClassLoader)後,接下來的事情會自動完成。

final URL myUrl = getClass().getResource("/configs/docs/getting-started.xml"); (1)
XmlConfiguration xmlConfig = new XmlConfiguration(myUrl); (2)
CacheManager myCacheManager = CacheManagerBuilder.newCacheManager(xmlConfig); (3)
myCacheManager.init();  (4)

(1). 獲取xml文件的位置

(2). 通過xml文件的url實例化一個XmlConfiguration

(3). 使用靜態方法CacheManagerBuilder.newCacheManager(Configuration)創建CacheManager

(4). 在使用之前要初始化cacheManager

我們也可以使用<cache-template>來作為CacheConfigurationBuilder的配置,為了使用<cache-template>元素你需要創建一個xml文件,包含如下內容:

<cache-template name="example">
  <key-type>java.lang.Long</key-type>
  <value-type>java.lang.String</value-type>
  <heap unit="entries">200</heap>
</cache-template>

用如下的方式創建CacheConfigurationBuilder

XmlConfiguration xmlConfiguration = new XmlConfiguration(getClass().getResource("/configs/docs/template-sample.xml"));
CacheConfigurationBuilder<Long, String> configurationBuilder = xmlConfiguration.newCacheConfigurationBuilderFromTemplate("example", Long.class, String.class); (1)
configurationBuilder = configurationBuilder.withResourcePools(ResourcePoolsBuilder.heap(1000)); (2)

(1). 創建builder,繼承cache-template的屬性,heap的大小為200個entry。

(2). 重寫繼承的屬性

 

四. 編程的方式配置XML文件

就像根據xml文件創建cache manager一樣,反向翻譯也是支持的。

CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
  .with(CacheManagerBuilder.persistence(tmpDir.newFile("myData")))
  .withCache("threeTieredCache",
    CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
      ResourcePoolsBuilder.newResourcePoolsBuilder()
        .heap(10, EntryUnit.ENTRIES)
        .offheap(1, MemoryUnit.MB)
        .disk(20, MemoryUnit.MB, true))
      .withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofSeconds(20)))
  ).build(false);

Configuration configuration = cacheManager.getRuntimeConfiguration();
XmlConfiguration xmlConfiguration = new XmlConfiguration(configuration);  (1)
String xml = xmlConfiguration.toString(); (2)

(1). 通過CacheManager的configuration來實例化一個XmlConfiguration

(2). 通過使用toString方法來獲得xml內容

不是所有的編程式的配置都可以轉換成xml文件的,如果cache manager中包含瞭如下的內容就不可以轉換:

  1. EvictionAdvisor
  2. 自定義的ExpiryPolicy,而不是從ExpiryPolicyBuilder從獲取的timeToLiveExpiration或者是timeToIdleExpiration
  3. 使用實例代替他們的classes:
    a. Serializer
    b. Copier
    c. CacheLoaderWriter
    d. CacheEventListener
    e. ResilienceStrategy

 

五. 在一個文件中配置多個CacheManager

使用該特性最簡單配置就是嵌套多個cache manager configurations在同一個xml文件中。

<multi:configurations
  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  xmlns='http://www.ehcache.org/v3'
  xmlns:multi='http://www.ehcache.org/v3/multi'
  xsi:schemaLocation='http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd
  http://www.ehcache.org/v3/multi http://www.ehcache.org/schema/ehcache-multi.xsd'> <!--1-->

  <multi:configuration identity="foo-manager"> <!--2-->
    <config>
      <cache alias="foo">
        <key-type>java.lang.String</key-type>
        <value-type>java.lang.String</value-type>
        <resources>
          <heap unit="entries">20</heap>
          <offheap unit="MB">10</offheap>
        </resources>
      </cache>
    </config>
  </multi:configuration>

  <multi:configuration identity="bar-manager">
    <config>
      <cache alias="bar">
        <key-type>java.lang.String</key-type>
        <value-type>java.lang.String</value-type>
        <resources>
          <heap unit="entries">20</heap>
          <offheap unit="MB">10</offheap>
        </resources>
      </cache>
    </config>
  </multi:configuration>
</multi:configurations>

(1). 最頂級的元素<configurations>包含了namespace和一些核心schema。

(2). 每個Ehcache的配置都包含在configuration標簽中,並且他需要一個唯一的標識identity屬性。

 

通過xml文檔創建XmlMultiConfiguration實例。

    XmlMultiConfiguration multipleConfiguration = XmlMultiConfiguration
      .from(getClass().getResource("/configs/docs/multi/multiple-managers.xml")) (1)
      .build();  (2)
    Configuration fooConfiguration = multipleConfiguration.configuration("foo-manager"); (3)

(1). XmlMultiConfiguration是XML文件中resource的集合

(2). 構建這個配置

(3). 可以通過他們的identites獲取Configuration實例

 

多個CacheManager的變體

對於給定的manager,可以通過包含一系列<variant>標簽來提供變體配置,每個標簽中都需要一個type屬性。

<multi:configurations
  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  xmlns='http://www.ehcache.org/v3'
  xmlns:multi='http://www.ehcache.org/v3/multi'
  xsi:schemaLocation='http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd
  http://www.ehcache.org/v3/multi http://www.ehcache.org/schema/ehcache-multi.xsd'>

  <!-- tag::variants[] -->
  <multi:configuration identity="foo-manager">
    <multi:variant type="heap">
      <config>
        <cache alias="foo">
          <key-type>java.lang.String</key-type>
          <value-type>java.lang.String</value-type>
          <resources>
            <heap unit="entries">1000</heap>
          </resources>
        </cache>
      </config>
    </multi:variant>
    <multi:variant type="offheap">
      <config>
        <cache alias="foo">
          <key-type>java.lang.String</key-type>
          <value-type>java.lang.String</value-type>
          <resources>
            <heap unit="entries">1000</heap>
            <offheap unit="MB">128</offheap>
          </resources>
        </cache>
      </config>
    </multi:variant>
  </multi:configuration>
  <!-- end::variants[] -->

  <multi:configuration identity="bar-manager">
    <config>
      <cache alias="bar">
        <key-type>java.lang.String</key-type>
        <value-type>java.lang.String</value-type>
        <resources>
          <heap unit="entries">1000</heap>
        </resources>
      </cache>
    </config>
  </multi:configuration>
</multi:configurations>

可以通過指定variant和identity來獲取一個cache configuration

 Configuration fooConfiguration = variantConfiguration.configuration("foo-manager", "offheap"); 

上面的僅僅是一個例子,variant的類型可以有很多種:development vs production,clustered vs unclustered,red vs blue等等。

註意:當Configurations中有多個variant時必須有一個variant指定type,否則在獲取時會拋出IllegalStateException異常。當Configurations中沒有多個variants時將始終為所有的請求返回單個的配置。

 

獲取多個CacheManager

通過遍歷identites,可以從XmlMultiConfiguration中獲取多個CacheManager

    Map<String, Configuration> allConfigurations = multipleConfiguration.identities().stream() // <1>
      .collect(Collectors.toMap(i -> i, i -> multipleConfiguration.configuration(i))); // <2>
    Map<String, Configuration> offheapConfigurations = variantConfiguration.identities().stream()
      .collect(Collectors.toMap(i -> i, i -> variantConfiguration.configuration(i, "offheap"))); // <3>

(1). 多個配置中identites集合的stream

(2). 映射每個identity到他的唯一配置上

(3). 另一種選擇為映射每個identity到指定的variant配置上

 

構建多個配置的XML

XmlMultiConfiguration實例可以被組裝和修改通過使用相關的API,之前解析XML Multi-Configuration的例子僅僅是一個簡單的調用。

Configurations可以從頭被構建,像下麵那樣:

    XmlMultiConfiguration multiConfiguration = XmlMultiConfiguration.fromNothing() // <1>
      .withManager("bar", barConfiguration) // <2>
      .withManager("foo").variant("heap", heapConfiguration).variant("offheap", offheapConfiguration) // <3>
      .build(); // <4>

(1). 創建一個空的XmlMultiConfiguration

(2). 添加configuration,不帶variants

(3). 添加一個configuration帶兩個不同的variants:heap和offheap

(4). 構建最終的configuration實例

 

他們也可以通過已經存在的配置中構建

    XmlMultiConfiguration modified = XmlMultiConfiguration.from(multiConfiguration) // <1>
      .withManager("foo") // <2>
      .build();

(1). multiConfiguration是一個已經存在配置

(2). Remove the configuration with identity "foo"

 

以xml的格式獲取一個已經構建的multi-configuration

    String xmlString = multiConfiguration.asRenderedDocument(); // <1>
    Document xmlDocument = multiConfiguration.asDocument(); // <2>

(1). 以字元串的形式獲取xml

(2). 以DOM的形式獲取xml

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 許多公司網站被黑被進犯,首要牽扯到的便是網站的開發言語,包含了代碼言語,以及資料庫言語,現在大多數網站都是運用的PHP,JAVA,.net言語開發,資料庫運用的是mysql,oracle等資料庫,那麼網站被進犯了該怎樣辦?運營一個網站,總被進犯是時有發生的,特別一些公司網站,以及個人建站,都是沒有專 ...
  • 新聞 "Amazon.Lambda.RuntimeSupport發佈" "Forge 3.0架構" "Blazor 0.9.0試驗版發佈" "通過微軟游戲棧實現更多應用" "介紹ASP.NET Core中的gRPC" "Mac上的Visual Studio 2019 8.0版本預覽4" "FlexS ...
  • 說明 操作系統:Windows 10 Python 版本:3.7x 虛擬環境管理器:virtualenv 代碼編輯器:VS Code 環境搭建 打開 執行下述操作 Hello World 在 目錄下創建一個 __init__.py ,示例代碼如下所示: 在 目錄下創建一個 manage.py 文件, ...
  • 前言:由於對面向對象思想認識的不夠深刻,所以這一單元的作業寫的是非常不oo的,從代碼結構來看,結構也顯得有些混亂,,沒有一個清晰的設計。 作業分析 第一次作業 反思 1. 輸入 對於三次的作業其實大部分的難點就是在判斷輸入的合法性上,對於第一次作用來說,最初的想法還是用一整個正則表達式來判斷輸入,但 ...
  • ~~「前言」為防止在某巨巨的毒瘤idea 紫荊花之“店" 面前一臉懵,特滾來補此題。~~ ~~我還是太naive了。~~ 「題義」給出一棵單點度數很小的無根帶邊權、點權的樹,每次詢問在所有點權在\[l,r\]的點到c的距離之和。 「分析」考慮建立點分樹,分治結構每個點都儲存對應分治範圍(簡稱範圍)內 ...
  • 一、環境需求 二、怎樣使用 三、本地化 3.1擴展卡爾曼濾波本地化 3.2無損卡爾曼濾波本地化 3.3粒子濾波本地化 3.4直方圖濾波本地化 四、映射 4.1高斯網格映射 4.2光線投射網格映射 4.3k均值物體聚類 4.4圓形擬合物體形狀識別 五、SLAM 5.1迭代最近點匹配 5.2EKF SL ...
  • 一、CAS概念與原理 CAS,全稱Compare And Swap(比較與交換),解決多線程並行情況下使用鎖造成性能損耗的一種機制。 實現思想 CAS(V, A, B),V為記憶體地址、A為預期原值,B為新值。如果記憶體地址的值與預期原值相匹配,那麼將該位置值更新為新值。否則,說明已經被其他線程更新,處 ...
  • Python 提供了很多內置的工具函數(Built-in Functions),在最新的 Python 3 官方文檔中,它列出了 69 個。 大部分函數是我們經常使用的,例如 print()、open() 與 dir(),而有一些函數雖然不常用,但它們在某些場景下,卻能發揮出不一般的作用。內置函數們 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...