首頁>技術>

軟體專案實訓及課程設計指導——如何應用EhCache快取框架提高軟體應用系統持久層響應效能

1、在Web應用系統中應用持久層相關的快取框架

在Java應用程式開發實現和J2EE Web應用系統的設計和開發實現中,軟體應用系統的設計和開發實現人員可以在系統的表示層和系統的持久層中充分地應用快取機制和相應實現技術能夠大大地提高Web應用系統的訪問效能。

比如資料庫連線池、多執行緒應用中的執行緒池、物件複用池以及各種應用框架中的快取外掛,如Hibernate框架中常使用的二級快取外掛EHCache,分散式應用環境中的快取記憶體系統MemCache,基於key-value(鍵/值對)遠端字典服務的Redis以彌補MemCache等系統在key-value形式的儲存應用中的不足。

因此,合理並有效地使用快取技術能夠最佳化軟體應用系統中的資料訪問效能,這特別是在基於Web方式的應用系統中由於要支援大併發的訪問量,更應該要應用相關的快取技術——有效地應用快取技術可以減少Web伺服器與資料庫伺服器之間的網路互動的次數,從而提高應用系統資料訪問速度並減少等待時間。

作者在下文為讀者介紹在J2EE應用系統中廣泛應用的兩個較流行的Java物件快取框架Whirlycache和EhCache,考慮到本文的篇幅關係,作者重點介紹EhCache快取框架。

2、在Web應用系統中應用whirlycache快取框架

(1)Whirlycache是一個快速的、可配置的、存在於記憶體中的物件快取

(2)熟悉和應用Whirlycache開源快取專案

Whirlycache開源快取專案需要開發人員在系統的Classpath路徑中新增一個名稱為whirlycache.xml的配置檔案——如果開發人員沒有提供該配置檔案,Whirlycache系統將自動地應用whirlycache jar包檔案中的whirlycache-default.xml檔案中的預設的配置專案。

另外,為了能夠簡化開發人員對使用Whirlycache開源快取專案的配置工作,在Whirlycache開源快取專案中為開發人員提供了一個模板的配置檔案,只需要在該模板配置檔案中進行區域性地調整有關的配置專案就可以應用Whirlycache開源快取系統。

如果讀者需要了解和學習如何應用Whirlycache開源快取系統,可以瀏覽Whirlycache的官方網站上提供的線上幫助文件說明。下圖所示為Whirlycache的官方網站上提供的"Quick Start"的幫助內容的區域性截圖,從該頁面中可以瞭解如何透過程式設計方式快取應用系統中的物件的程式程式碼。

3、在Web應用系統中應用EhCache快取框架

(1)Ehcache開源快取系統

EhCache快取具有執行速度快、結構簡單、佔用記憶體小以及很小的依賴性、並支援多CPU伺服器等技術特性。在J2EE 平臺中的O/R Mapping型別框架——Hibernate框架中將EhCache快取作為一個外掛被引入,並作為Hibernate框架的查詢快取的實現外掛。

(2)在Hibernate框架中使用EhCache開源快取系統

在Hibernate框架中如果需要使用EhCache開源快取專案,首先需要在hibernate.cfg.xml的配置檔案中新增如下的設定專案:

<property name=" hibernate.cache.provider_class">					org.hibernate.cache.EhCacheProvider</property>

其次,EhCache快取系統有它自己的配置檔案——檔名稱為ehcache.xml,在Hibernate框架的系統庫中的etc目錄下有一個ehcache.xml的模板配置檔案,讀者只需要將其複製到Web應用程式的WEB-INF/classes目錄下、並對其中的相關專案進行更改以匹配自己的Web應用程式。如下示圖為某個專案中的ehcache.xml模板配置檔案程式碼示例。

4、在Hibernate框架的系統包中已經包含有Ehcache的系統庫檔案

然後將進入Hibernate框架的系統庫下載的頁面,參看如下示圖所示。讀者可以根據待開發的專案需要下載對應版本的Hibernate框架的系統庫檔案(一般是下載最新版本)。

5、在Web專案中應用Hibernate框架中的查詢快取

很多Hibernate框架的使用者在呼叫其相應方法時都迷信地相信"Hibernate框架會自行為我們處理效能的問題",或者"Hibernate會自動為我們的所有操作呼叫快取"。實際的情況是Hibernate雖然為我們提供了很好的快取機制和擴充套件快取框架的支援,但是必須經過正確的呼叫,它才有可能發揮作用。

所以造成很多應用系統中使用Hibernate框架後出現了系統的效能問題,這實際上並不是Hibernate框架不行或者不好,而是因為使用者沒有正確的瞭解其使用方法而造成的。因此,為了能夠在Hibernate框架中正確地應用EhCache快取系統從而實現Hibernate框架中的查詢快取,需要完成如下的系統配置定義。

(1)在hibernate.cfg.xml系統配置檔案中進行相關的配置

為了啟用查詢快取(Query Cache),開發人員需要在hibernate.cfg.xml檔案中進行如下的配置,參考配置請參看如下程式碼示例中的黑體標識的程式碼或者參看如下示例圖中的配置結果。

<hibernate-configuration>      <session-factory>            …………            <property name="cache.use_query_cache"> true </property>            <property  name="cache.provider_class">org.hibernate.cache.EhCacheProvider            </property>            …………      </session-factory></hibernate-configuration>

該設定將會建立兩個快取區域:一個用於儲存Hibernate返回的查詢結果集(org.hibernate.cache.StandardQueryCache); 另一個則用於儲存最近查詢的一系列表的時間戳(org.hibernate.cache.UpdateTimestampsCache)。

但要注意的是,在查詢快取中,它並不快取結果集中所包含的實體的確切狀態;它只快取這些實體的識別符號屬性的值、以及各值型別的結果。所以查詢快取通常會和二級快取一起使用。如下示例圖顯示某個專案中啟用了Hibernate框架的查詢快取後,在控制檯中輸出的狀態提示資訊。

但要注意的是,如果在Web應用系統專案中是使用Spring框架呼叫Hibernate框架的sessionFactory(會話工廠物件)方式時,則需要進行如下的設定定義(注意其中黑體標識的程式碼)。

<bean id="sessionFactory"								class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="datasource" /> </property> <property name="hibernateProperties">   <props>     <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>							<prop key="connection.provider_class">													org.hibernate.connection.C3P0ConnectionProvider</prop>    <prop key="hibernate.show_sql">true</prop>    <prop key="hibernate.cache.use_query_cache">true</prop>						 <prop key="hibernate.cache.provider_class">													org.hibernate.cache.EhCacheProvider</prop>   </props> </property> <property name="mappingDirectoryLocations">   </list><value>/WEB-INF/classes/cn/rmic/manager/hibernate/<value> </list> </property></bean>

很多的Hibernate框架的使用者在配置到這一步就以為完事了,其實光這樣配置,根本就沒有使用Hibernate框架的二級快取。同時因為在使用Hibernate框架時大多時候是馬上關閉會話session。所以,Hibernate框架中的一級快取也沒有起到任何作用。結果就是沒有使用任何的快取,所有的Hibernate框架的操作都是直接操作物理資料庫系統。

因此,正確的辦法是除了以上的配置外,還應該配置每一個PO持久物件的具體快取策略,在影射檔案中增加配置對應的專案。

(2)在Hibernate框架的物件/關係對映檔案中配置出對持久物件的具體快取的應用策略

<class name="example.UserInfo" table="userInfo">      <cache usage="read-only"/>      ....</class>

在上面的配置專案中的關鍵就是這個<cache usage="read-only"/>專案,其中的usage屬性可以有如下的幾個選擇:read-only、read-write和transactional等。此外,在程式程式碼中只有透過呼叫query.iterate()方法時,Hibernate框架系統程式才會呼叫快取中儲存的資料。同時 get 和 load方法也都會查詢在快取中儲存的資料。

(3)在Web專案中還需要配置與EhCache快取系統相關的配置

為此,需要在Web專案中系統根目錄中新增一個檔名稱為ehcache.xml的XML格式的配置檔案,操作過程可以參考如下示例圖。

本示例所涉及的ehcache.xml配置檔案的示例程式碼請參看如下程式碼示例,並注意其中黑體標識的程式碼或者參看如下示例圖中的最終配置結果。

<?xml version="1.0" encoding="UTF-8" ?><ehcache>    <diskStore path="java.io.tmpdir"/>    <defaultCache maxElementsInMemory="10000" eternal="false"   							 timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />    <cache name="org.hibernate.cache.StandardQueryCache"    						maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"   						 timeToLiveSeconds="7200" overflowToDisk="true"/>    <cache name="org.hibernate.cache.UpdateTimestampsCache"   						 maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/>    <cache name="myCacheRegion" maxElementsInMemory="10" eternal="false"    					timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" /></ehcache>

(4)在Web專案的DAO元件中將Query.Cacheable設定為true

絕大多數的查詢並不能從查詢快取中受益,所以Hibernate框架預設是不進行查詢快取的。如果在Web應用系統專案中需要啟用查詢快取,請呼叫 Query.setCacheable(true)方法。這個呼叫會讓查詢在執行過程中先從快取中查詢結果,並將自己的結果集放到快取中以更新快取。

因此,在Web應用系統程式中必須在查詢執行之前,將Query.Cacheable屬性設定為true,而且每次都應該要進行這樣的設定。參看如下的程式碼示例或者參看如下示例圖所示的程式碼:

Query oneQuery =session.createQuery(hql).setInteger(0.15);oneQuery.setCacheable(true);

當然,也可以採用如下形式的程式碼:

oneQuery.setCacheable(true); //啟用查詢快取oneQuery.setCacheRegion("myCacheRegion"); //指定要使用的cacheRegion,可選

上面程式碼示例中的第二行指定要使用的cacheRegion是名稱為myCacheRegion的配置定義(參看如下示例圖所示),即開發人員可以給每個查詢快取做一個單獨的配置——這樣開發人員能夠實現對查詢快取的失效策略進行精確的控制,透過呼叫Query.setCacheRegion()方法, 為每個查詢指定其命名的快取區域。

如果使用setCacheRegion方法來做這個指定,則需要在ehcache.xml檔案中配置它(請見前面的配置示例)。如果省略第二行,不設定cacheRegion的話,那麼會使用上面提到的標準查詢快取的配置,也就是org.hibernate.cache.StandardQueryCache;如果不存在與類名匹配的cache名稱,則用defaultCache名稱。

但要注意的問題是:當Hibernate框架更新資料庫中的資料時,它怎麼知道更新哪些查詢快取呢?

Hibernate框架會維護對每個資料庫表的最後更新時間,這些更新時間其實也就是放在上面org.hibernate.cache.UpdateTimestampsCache所指定的快取配置裡面。

當透過Hibernate框架更新時,Hibernate框架會知道這次更新影響了哪些資料庫表。然後它更新這些資料庫表的最後更新時間。每個快取都有一個生成時間和這個快取所查詢的資料庫表,當Hibernate框架查詢一個快取是否存在時,如果此快取存在,它還要取出快取的生成時間和這個快取所查詢的資料庫表,然後去查詢這些資料庫表的最後更新時間,如果有一個數據庫表在生成時間後更新過了,那麼這個快取將是無效的。

因此,可以看出,Web應用系統只要更新過一個數據庫表,那麼凡是涉及到這個資料庫表的查詢快取就失效了,因此查詢快取的命中率可能會比較低。

(5)在Hibernate框架的hibernate.cfg.xml系統配置檔案中新增如下配置:<property name="log4j.logger.org.hibernate.cache">debug</property>

該配置專案的主要目的是在除錯Web應用系統中的相關程式時能夠使用Log4j日誌處理系統輸出除錯相關的資訊(等同於log4j.logger.org.hibernate.cache=debug),從而能夠更方便地瞭解EhCache快取系統的工作過程。

但這個配置定義專案主要用於對Web應用專案程式除錯的過程,在Web應用系統正式釋出時候,需要透過註釋的方式除掉該配置專案,以免影響Web應用系統的效能。

11
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Flink定時器ctx.timerService如何資料