如何應用EhCache緩存框架提高J2EE Web應用系統持久層的響應性能

2020-12-23 楊教授工作室

軟體項目實訓及課程設計指導——如何應用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是一個快速的、可配置的、存在於內存中的對象緩存

該緩存框架為開源項目,能夠通過緩存對象來加快Web應用系統的請求響應的速度。讀者可以在Whirlycache的官方網站(參看下圖瀏覽器URL地址欄中所示的下載地址)下載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框架的查詢緩存的實現插件。

讀者可以通過EhCache官方網站(參看如下示圖所示的瀏覽器URL地址欄中的地址)獲得EhCache相關的系統包文件及技術幫助文檔。

(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 ORM」連結(參看如下示圖所示的連結)。

然後將進入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>

<diskStorepath="java.io.tmpdir"/>

<defaultCachemaxElementsInMemory="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應用系統的性能。

課程設計指導——如何應用OSCache緩存框架提高Web頁面響應性能

課程設計指導—如何在Struts框架中應用FreeMarker模板技術的實例

如何應用Web頁面靜態化技術以提高J2EE Web應用系統的響應性能

如何應用XML+XSLT+AJAX組合技術實現無刷新的數據查詢的應用實例

課程設計指導——應用AJAX技術提高Web應用系統的整體響應性能

相關焦點

  • 課程設計指導——如何應用OSCache緩存框架提高Web頁面響應性能
    軟體項目實訓及課程設計指導——如何應用OSCache緩存框架提高Web頁面響應性能1、緩存應用技術是提高軟體應用系統性能的最簡單和最有效的方式之一在計算機的軟硬體系統中大量地應用緩存(Cache)技術,所謂「緩存」是指位於「目標」(可以為軟體類的應用系統,也可以為硬體設備或者部件
  • 如何應用Web頁面靜態化技術以提高J2EE Web應用系統的響應性能
    軟體項目實訓及課程設計指導——如何應用Web頁面靜態化技術提高Web應用系統的響應性能1、什麼是Web頁面靜態化技術(1)Web頁面靜態化技術將JSP動態頁面按照某種模板格式生成對應的*.html純靜態Web頁面的過程
  • 如何優化Web應用數據訪問實現方式以提高軟體應用系統的響應性能
    軟體項目實訓及課程設計指導——如何優化Web應用數據訪問實現方式以提高軟體應用系統的響應性能在軟體應用系統中離不開數據訪問和數據處理兩個方面的功能,而數據處理之前首先要進行數據訪問,也就是只有快速地獲得了數據,才能進行下一步的數據處理。
  • 如何正確地設計J2EE應用系統持久層中的各個組件結構及組件間關係
    軟體項目實訓及課程設計指導——如何正確地設計J2EE應用系統持久層中的各個組件結構及關係1、了解J2EE應用系統數據持久層中的各個組件類的類型在J2EE系統平臺下的軟體應用系統的數據持久層,一般都包含有如下的各個組件類:實體類、數據訪問對象類(包括接口和對應的實現類
  • 課程設計指導——應用AJAX技術提高Web應用系統的整體響應性能
    軟體項目實訓及課程設計指導——應用AJAX技術提高Web應用系統的整體響應性能1、軟體應用系統的性能指標是衡量軟體應用系統優劣程度的一個重要指標Web應用系統由於是基於HTTP協議產生請求、並由Web伺服器端程序處理對應的請求、最後再次通過HTTP響應向Web
  • Laravel框架從9處助力Web應用開發
    本文將向您介紹什麼是Laravel,以及它將如何從九個方面提高Web應用的開發效率和競爭優勢:Laravel框架的歷史和演變Laravel是一個開源框架,旨在利用MVC架構模式,基於Symfony(譯者註:一個開源的PHP Web框架)來創建Web應用程式。開發人員可以使用它所提供的各種出色的API,來加快開發的進程,並簡化目標網站構建。
  • 如何正確應用對象/關係映射技術實現應用系統持久層中各個DAO組件
    軟體項目實訓及課程設計指導——如何正確地應用對象/關係映射(O/R Mapping)技術實現應用系統持久層中的各個DAO組件1、了解軟體應用系統持久層實現中的對象/關係映射技術(1)對象/關係映射(O/R Mapping)技術產生的背景
  • 如何在Web應用中實現Velocity 與Struts 框架相互集成的應用實例
    軟體項目實訓及課程設計指導——如何在Web應用系統中實現Velocity 與Struts 框架相互集成的應用實例1、Velocity Tools 子項目及其中的 VelocityStruts 組件(1)Velocity Tools是什麼
  • IO系統性能之二:緩存和RAID如何提高IO
    【IT168 專稿】從上一篇文章:IO系統性能之一:衡量性能的幾個指標的計算中我們可以看到一個15k轉速的磁碟在隨機讀寫訪問的情況下IOPS竟然只有140左右,但在實際應用中我們卻能看到很多標有5000IOPS甚至更高的存儲系統,有這麼大IOPS的存儲系統怎麼來的呢?
  • 如何在Web應用系統表示層開發實現中應用Velocity模板技術
    軟體項目實訓及課程設計指導——如何在Web應用系統表示層開發實現中應用Velocity模板技術1、分離Web表示層的數據處理和展現邏輯的常見的應用技術分離Web表示層的數據處理和展現邏輯是目前企業級的Web應用系統開發中表現層組件開發實現中的基本實現目標。
  • java和php在web開發方面對比分析
    使用javabean可以方便的實現java代碼和html的分離,能夠增強系統的功能和軟體的復用性。java的web開發屬於sun公司定義的j2ee其中的規範。而且在j2ee中包括了java的web開發的所有方面,如:jsp、servlet、jdbc、jndi、javabean、ejb等等。j2ee就特別適合於做大型的企業級的應用。
  • J2EE學習步驟
    回復一:1、學習Java學習jsp+javaBean2、學習GoF模式, 再學習jive中模式處理設計3、學習分層架構:表現層、持久層模式:struts hibernate4、學習業務層模式 Ioc依賴注射模式及其應用案例,如JdonFramework和jivejdon3
  • 如何在Web應用中實現Velocity 與Struts2框架相互集成的應用實例
    軟體項目實訓及課程設計指導——如何在Web應用系統中實現Velocity 與Struts2框架相互集成的應用實例1、Struts 2應用框架提供對 Velocity 和 FreeMarker 模板引擎的支持在Struts 2應用框架中不僅繼續保留有對Velocity
  • 科普應用伺服器,與Web伺服器有啥區別?
    【IT168 資訊】它位於網絡和資料庫之間,那麼應用伺服器實際上是做什麼的?應用程式伺服器是為應用程式提供業務邏輯的代碼。它是基於組件的,位於以伺服器為中心的架構的中間層。這個架構主要基於Web。中間層是業務邏輯所在的應用伺服器。而第三層,則是事務伺服器的資料庫。
  • 如何解析 web 應用程式
    web 應用的站點地圖,也就是網站的所有頁面和功能,我們可以對其測試的攻擊面,主要分幾種:主動式爬蟲、被動式抓取、隱藏頁面獲取、頁面參數擴展。主動式爬蟲:這個很好理解,就是爬蟲,通過頁面之間的超連結關聯來一層一層獲取頁面內容,然後從內容中匹配頁面連結,逐步將網站的所有連結完整爬取,對於從來沒有在其他網頁設置超連結的頁面是無法通過這種方式獲取到的,工具的話,可以用自實現的爬蟲工具,用 python 寫的居多,如今的網站好多架構前端都是 nodejs 框架,數據的獲取通過普通的爬蟲已經無法實現,可以藉助無頭瀏覽器來對頁面進行解析
  • 如何利用MyEclipse開發工具開發基於Velocity模板的Web應用
    讀者在上圖中所示的Web表單框中輸入用戶名稱和密碼,然後點擊其中的「提交」按鈕後,Web表單頁面將向Web應用系統後臺的Servlet組件提交Web請求,最後將出現如下示圖所示的執行結果狀態——本示例為了驗證應用Velocity模版引擎的正確性,在響應頁面中獲得用戶登錄的帳戶和密碼等信息,然後在頁面中顯示以比對是否正確地獲得了相關的數據。
  • 如何正確地應用JDBC API設計實現應用系統持久層中的各個DAO組件
    軟體項目實訓及課程設計指導——如何正確地應用JDBC API設計和實現應用系統持久層中的各個DAO組件1、Java 系統平臺中實現資料庫連接技術相關的APIJava 資料庫連接技術(JDBC,Java DataBase Connectivity)是一種將Java
  • Laravel框架改善Web App開發的9種方法
    Laravel PHP框架是軟體開發領域的一項創新。它允許遵循MVC模式進行自定義Web應用程式開發。該框架由泰勒·奧特威爾(Taylor Otwell)在2011年開發,由於其敏捷的開發方法,該框架在其他PHP框架中的地位日益提高。Laravel具有許多優勢和強大的功能,可以更快地構建穩定的應用程式和網站。
  • Web應用程式開發五步法
    那麼作為一名Web開發人員,怎樣去開發一款優秀的Web應用程式呢?這個問題沒有一個簡單的答案,甚至那些教育機構都未必能清楚的知道。所以,像大多數在這個領域裡的web開發人員一樣,我們只是通過去做,去實驗才學會了這些。沒有人告訴我們如何去做,我們從給自己做點什麼東西開始,學會如何開發web應用程式是在這個過程中的一個副產品。這是學習任何語言的一個非常有效的方法。
  • 架構師視角|分布式緩存如何選擇?
    如今,緩存系統的應用非常廣泛,能夠用來提高並發數、數據吞吐量,提高快速響應能力。那麼當數據量達到一定程度,單機環境可能就顯得有些力不從心了,就需要一個分布式緩存系統。1.緩存雪崩同一時刻大量緩存失效(故障), 請求到了 DB。隨機時間:在設置過期時間時,可以在基礎時間上 + 一個隨機的時間,等於實現了分批過期。後臺更新:將更新失效的工作交給後臺定時線程。限流 + 本地緩存:如 ehcache 本地緩存 + Hystrix 限流。