Ehcache配置+Spring

如下內容是根據JSR107-Java-Caching-API,加上平時的使用總結的。html

注:建議在讀下面的內容以前,先去了解下JSR107中的內容,trust me!java

1、Fundamentals 

1. JSR107中定義了五種core interfaces

  • CachingProvider
  • CacheManager
  • Cache
  • Entry(這個Entry就是放入到Cache中的key-value鍵值對)
  • ExpiryPolicy(過時策略)

    對上圖的說明:一個Application能夠使用多個CachingProvider;每一個CachingProvider能夠管理多個CacheManager;每一個CacheManager能夠管理多個Cache;每一個Cache中能夠有多個Entry。在Spring中使用這個Ehcache時,就須要定義CacheManager的name和CacheManager中管理的Cache。web

2. Store-By-Value 和 Store-By-Reference

    Entry存儲在Cache中時,有倆種機制: Store-By-Value和Store-By-Reference。spring

  • Store-By-Value: JSR107中規定,在將Entry存儲到Cache時,對Key和Value進行拷貝,然後實際存儲到Cache中的是這個拷貝值;從Cache中讀取時,實際拿到的只是Cache中Entry的拷貝值。因此Store-By-Value時即便對對象進行了修改,也不會影響到Cache中對應的Entry。
  • Store-By-Reference: JSR107中規定,這種方式是引用存儲,存入到Cahe中的是引用,從Cache中返回的也是引用,因此在使用這種方式時,必定要注意修改帶來的相互影響。

        實際使用時是Reference還Value類型,可自行寫幾行代碼驗證下,本人驗證了下,在不配置特殊參數的狀況是Reference類型。 網絡

       因爲JSR107只是規範,而實際的每一個廠商底層實現的不一樣,加上可能寫到磁盤或者Ehcache集羣(Entry要在網絡中傳輸),因此Entry中的key和value最好都實現java.io.Serializable。框架

2、Ehcahce與Spring

1. ehcache配置的例子

    以下是ehcache配置文件,暫且將該文件命名爲ehcache.xml(後面說明中要用到)。ide

<?xml version="1.0"?>
<ehcache xmlms:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="ehcache.xsd">
	<diskStore path="java.io.tmpdir" />
	<cache name="userCache" maxElementsInMemory="1000" eternal="false"
		timeToIdleSeconds="0" timeToLiveSeconds="10" overflowToDisk="false"
		memoryStoreEvictionPolicy="LFU" />
</ehcache>

2. Spring中使用ehcache的例子

    Spring中使用ehcache.xml以下圖所示,由EhcacheManagerFactoryBean源碼可知,這個ehcache.xml被用於建立一個CacheManager。Spring容器中userCacheManager對應的bean是一個CacheManager(若是以爲困惑,那麼先去了解下org.springframework.beans.factory.FactoryBean的做用——Mybatis的SqlSessionFactoryBean也使用了FactoryBean的功能,然後再去看下EhCacheManagerFactoryBean的源碼)。學習

<bean id="userCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
	<property name="configLocation" value="classpath:ehcache.xml"/>
    <property name="cacheManagerName" value="userCacheManager"/>
</bean>

    至此咱們就有了一個name爲userCacheManager的CacheManager,以後就能夠使用name爲userCache的Cache了。spa

3、Ehcache的xml配置

     這種xml配置通常都有一個schema用於約束xml節點或節點屬性的值以及類型。因此能夠先去看下ehcache官方給出的ehcache.xsd,Spring中用於配置bean的xml也有它本身的schema,並且Spring的xsd在細節、註釋上比ehcache的好。設計

1. ehcache元素中容許出現的元素類型

    下圖上框中ref的值是ehcache節點中容許的元素種類;下框中name的值是ehcache節點的屬性name。好比從下圖中能夠看出ehcache節點中能夠出現0個或多個cache元素;可是diskStore只能出現0個或者1個;ehcache的屬性updateCheck的默認值是true。

    配置不少,這裏就不細細列出了,建議去查看下官方的ehcache.xsd。

4、結尾

     最近在看Ehcache的實現,發現其底層用到了LinkedHashmap、ConcurrentHashmap,且在此基礎之上作了必定的個性化,可是如何作到element的searchable、寫到disk等是如何實現,目前還沒看到。待後續努力。

    在此,建議開發人員多去了解下JCP的規範,對了解框架有很大的幫助,好比

  1. Servlet規範(爲何Spring在web.xml中定義DispatcherServlet,若是不瞭解Servlet的執行流程,我以爲是難以看懂SpringMVC模塊代碼的)
  2. Jms規範(爲何建立connection的方式有多種)
  3. Java Transaction API (JTA)規範(爲何Spring中涉及事物時會有個ResourceManager)
  4. Jdbc規範(transaction、isolation、distributed transaction)

    一樣,咱們在設計框架時,應該注重規範化,參考JCP的相應規範,好比Spring batch模塊就遵循了batch規範,這樣框架纔會易於學習、傳播。

相關文章
相關標籤/搜索