GWT Spring和Hibernate進入數據網格世界

利用Infinispan數據網格的功能最大化Hibernate性能。 一個GWT , Spring , JPA , Hibernate , Infinispan集成教程。

在本教程中,我們將討論如何將Infinispan用作Hibernate二級緩存提供程序。 Infinispan是JBoss緩存的繼承者,也是公司在開源數據網格領域的旗艦。 為了使事情變得更有趣,我們將從上一篇關于Spring GWT Hibernate和JPA集成的文章的 結尾處繼續。 我們將使用我們的GWTSpring項目 ,并使用數據網格功能對其進行授權!

Hiberante從版本3.5開始就支持Infinispan作為二級緩存提供程序,我們將使用Hibernate 3.5.2版本和Infinispan 4.0.0版本。 您可以在此處下載Infinispan二進制發行版

強烈建議將Hibernate配置為使用JTA事務,以便Hibernate和Infinispan在同一事務中合作。 否則,對數據庫和二級緩存的操作將不會被視為單個工作單元。 這里的風險包括無法更新第二級高速緩存,而在數據庫正確提交數據的同時,舊高速緩存將保留陳舊數據。

由于我們將Web應用程序部署到一個獨立的環境( Apache – Tomcat )中,而不是為了完全滿足上述要求而部署到一個完全的,啟用JTA的應用程序服務器中,因此我們將在Spring中實現JTA環境。框架。 為此,我們需要一個符合JTA的交易管理器,而我們的首選客戶是Atomikos 。 當然,您可以使用您喜歡的任何符合JTA的事務管理器。 我們將使用Atomikos Transactions Essentials版本3.6.5,您可以從此處下載

最后但并非最不重要的一點是,我們將需要MySQL Connector / J連接到MySQL數據庫進行測試。 Atomikos Transactions Essentials的3.6.5版本已經過測試,可與MySQL Connector / J版本5.1.5很好地兼容,您可以從此處下載

為了在運行時正確集成Infinispan和Hibernate ,我們必須為Web應用程序提供所有必需的庫。 因此,復制下面在/ war / WEB-INF / lib下列出的文件(如果使用的是不同版本,請復制相關文件)

從Infinispan二進制分發

  • infinispan-core.jar
  • /lib/jboss-common-core-2.2.14.GA.jar
  • /lib/jcip-annotations-1.0.jar
  • /lib/jgroups-2.9.0.GA.jar
  • /lib/marshalling-api-1.2.0.GA.jar
  • /lib/rhq-pluginAnnotations-1.4.0.B01.jar
  • /lib/river-1.2.0.GA.jar

從Atomikos Transactions Essentials發行

  • /dist/transactions-essentials-all.jar
  • /lib/jca.jar
  • /lib/jms.jar
  • /lib/jmx.jar

MySQL Connector / J

  • mysql-connector-java-5.1.5-bin.jar

最后,為了使Atomikos在運行時正常運行,必須在我們的Web應用程序的類路徑上找到一個“ jta.properties”文件。 創建一個名為“ jta.properties”的文本文件,將其放在Eclipse項目的/ resources包下,并使用以下所示的屬性進行填充:

com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
com.atomikos.icatch.force_shutdown_on_vm_exit = true
com.atomikos.icatch.automatic_resource_registration = false
com.atomikos.icatch.console_log_level = INFO

現在,我們必須注意Eclipse項目的依賴性。 以下jar應包含在項目的Java構建路徑中:

  • hibernate3.jar

下一步是將Hibernate配置為使用MySQL語言和二級緩存。 在/ resources / META-INF文件夾下找到persistence.xml文件,然后執行以下描述的更改:

要使用MySQL語言,請添加以下屬性:

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />

要配置事務管理器以使用,請添加以下屬性:

<property name="hibernate.transaction.manager_lookup_class" value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />

要啟用啟用了查詢結果緩存的Hibernate二級緩存,您應該添加以下屬性:

<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

在這一點上,我們必須指出,啟用查詢結果緩存可能不會提高性能,尤其是在您的應用程序執行主要返回唯一結果的查詢的情況下。

要配置Infinispan緩存區域工廠,請添加以下屬性:

<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/>

我們還可以通過添加以下屬性來配置驅逐策略(此處為最近最少使用– LRU):

<property name="hibernate.cache.infinispan.entity.eviction.strategy" value= "LRU"/>
<property name="hibernate.cache.infinispan.entity.eviction.wake_up_interval" value= "2000"/>
<property name="hibernate.cache.infinispan.entity.eviction.max_entries" value= "5000"/>
<property name="hibernate.cache.infinispan.entity.expiration.lifespan" value= "60000"/>
<property name="hibernate.cache.infinispan.entity.expiration.max_idle" value= "30000"/>

通過使用逐出策略,我們可以通過無條件緩存對象來防止二級緩存占用所有可用的內存堆。 最近最少使用驅逐策略根據條目的使用頻率逐出。 在我們的情況下,將應用以下規則:

  • “ wake_up_interval”屬性定義控制器進程掃描二級緩存以查找候選逐出條目的頻率(此處為每2秒一次)
  • “ max_entries”屬性定義高速緩存條目的最大數量
  • “壽命”屬性定義了對象可以在緩存中保留的最長時間。 如果達到了對象的使用壽命,則無論訪問頻率如何(此處為1分鐘),都將逐出該對象。
  • “ max_idle”屬性定義在驅逐對象(此處為30秒)之前,對象可以空閑(不訪問)的最長時間。

最后,我們必須將“持久性單元”“事務類型”屬性更改為JTA

完整的persistence.xml文件應類似于以下提供的文件:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0"><persistence-unit name="MyPersistenceUnit" transaction-type="JTA"><provider>org.hibernate.ejb.HibernatePersistence</provider><properties><property name="hibernate.hbm2ddl.auto" value="update" /><property name="hibernate.show_sql" value="false" /><property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /><property name="hibernate.transaction.manager_lookup_class" value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" /><property name="hibernate.cache.use_second_level_cache" value="true"/><property name="hibernate.cache.use_query_cache" value="true"/><property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/><!-- <property name="hibernate.cache.infinispan.entity.eviction.strategy" value= "LRU"/><property name="hibernate.cache.infinispan.entity.eviction.wake_up_interval" value= "2000"/><property name="hibernate.cache.infinispan.entity.eviction.max_entries" value= "5000"/><property name="hibernate.cache.infinispan.entity.expiration.lifespan" value= "60000"/><property name="hibernate.cache.infinispan.entity.expiration.max_idle" value= "30000"/>--></properties></persistence-unit></persistence>

下一步是配置有關JTA數據源, Atomikos事務管理器和JPA / Hibernate的 Spring 。 在/ war / WEB-INF /下找到您的applicationContext.xml文件,并進行如下更改:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:task="http://www.springframework.org/schema/task"xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"><context:component-scan base-package="com.javacodegeeks.gwtspring" /><task:annotation-driven executor="myExecutor"scheduler="myScheduler" /><task:executor id="myExecutor" pool-size="5" /><task:scheduler id="myScheduler" pool-size="10" /><tx:annotation-driven /><bean id="entityManagerFactory"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="dataSource" ref="dataSource" /><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /></property></bean><bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"init-method="init" destroy-method="close"><property name="uniqueResourceName" value="javacodegeeks" /><property name="xaDataSourceClassName"value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" /><property name="xaProperties"><props><prop key="URL">jdbc:mysql://localhost:3306/javacodegeeks</prop><prop key="user">***</prop><prop key="password">***</prop></props></property><property name="maxPoolSize" value="50" /><property name="minPoolSize" value="20" /></bean><bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"init-method="init" destroy-method="close"><property name="forceShutdown" value="false" /></bean><bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.J2eeUserTransaction"><property name="transactionTimeout" value="300" /></bean><bean id="transactionManager"class="org.springframework.transaction.jta.JtaTransactionManager"depends-on="atomikosTransactionManager,atomikosUserTransaction"><property name="transactionManager" ref="atomikosTransactionManager" /><property name="userTransaction" ref="atomikosUserTransaction" /><property name="allowCustomIsolationLevels" value="true" /></bean></beans>

這里要注意的事情:

  • Spring Entity Manager Factory保留對數據源和JPA提供程序的引用,以便為我們的DAO正確提供ORM功能
  • 數據源被配置為XA資源。 如上所述,這是強制性的,以便Infinispan和數據庫參與相同的事務。 您必須根據數據庫配置更改“ xaProperties” URL,用戶和密碼屬性值。
  • 我們將Spring配置為使用符合JTA的 Atomikos事務管理器。

我們快完成了!

為了使實體可緩存,我們只需要這樣注釋即可。 在/ shared / dto包下找到EmployeeDTO對象,并添加@Cache批注,如下所示:

… import statements here … @Cache (usage=CacheConcurrencyStrategy.TRANSACTIONAL)
@Entity
@Table(name = "EMPLOYEE")
public class EmployeeDTO implements java.io.Serializable {private static final long serialVersionUID = 7440297955003302414L;…}

這里要注意的事情:

  • 我們將“緩存并發策略”指定為“ TRANSACTIONAL”,因為我們不僅想對緩存的對象執行檢索,而且還要執行創建/更新/刪除操作。

而已! 要部署Web應用程序,只需將/ war文件夾復制到Apache – Tomact“ webapps”文件夾中。 您可以將war文件夾的名稱更改為任何您喜歡的名稱,最好在項目名稱之后將其重命名,例如GWTSpringInfinispan

在午餐之前,應用程序不要忘記創建數據庫模式,這里是“ javacodegeeks”。

午餐應用程序將您的瀏覽器指向以下地址

http:// localhost:8080 / GWTSpringInfinispan /

如果一切順利,您應該會看到您的主頁。 應該顯示兩個文本框,每個文本框后面都有一個按鈕。 在第一個文本框中,您可以將雇員保存或更新到數據庫。 作為輸入,提供ID,名稱,姓氏和職位描述,并用空格字符分隔。 單擊“ SaveOrUpdate”按鈕,將提供的信息存儲到數據庫中。 對于現有員工條目(相同的ID),將執行更新。 第二個文本框用于檢索現有員工條目。 提供員工ID,然后單擊“檢索”按鈕。 如果該員工存在,則應該看到該員工的ID,姓名,姓氏和職位描述。

Atomikos事務管理器配置為在INFO級別生成日志記錄(請參見上面的“ jta.properties”文件)。 日志文件位于Apache – Tomcat安裝的bin目錄中。 打開文件并觀察對數據庫執行的查詢。 您應該期望以下內容:

  • 第一次對員工執行檢索操作。 雇員對象未緩存,并且對數據庫執行查詢。 現在應該緩存employee對象
  • 對同一員工執行第二次檢索操作。 現在不應該執行任何查詢。 從Infinispan檢索數據
  • 對同一員工執行更新操作。 在單個工作單元中對Infinispan和數據庫執行更新操作
  • 對同一員工執行第三次查詢。 不應對數據庫執行任何查詢,并且應該看到上一步中更新的數據!

您可以從此處下載該項目(如開頭所述,并且不包含先前的文章,所需的第三方庫)

玩得開心!

賈斯汀

相關文章 :
  • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
  • Spring 3 HornetQ 2.1集成教程
  • Spring3 RESTful Web服務
  • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示
  • 帶有Spring和Maven教程的JAX–WS

翻譯自: https://www.javacodegeeks.com/2010/06/gwt-spring-and-hibernate-enter-world-of.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374970.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374970.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記對一個key file crackme的破解

crackme下載地址: http://kssd.pediy.com/tutorial/exercise/section04/chap6-1-4-03.zip ------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------…

第八章 CTE 遞歸 及 分組匯總 高級部分(多維數據集)

UNION 等集合操作符&#xff1a;UNION 等以第一個 SELECT 的 列明 作為 整個結果集的列明&#xff0c;整個結果集 唯一認可的 唯一邏輯處理階段 是 ORDER BY 這個意思是說 只有 ORDER BY 是對整個結果集作用的&#xff0c;其它都操作都作用在 UINON 兩側的 子集合中。EXCEPT 操…

Java Code Geeks Andygene Web原型

大家好&#xff0c; 我們很高興地宣布&#xff0c;一組Maven原型的第一個版本已經發布&#xff01;&#xff01;&#xff01; 該集合的目的是提供可以滿足各種開發需求的項目模板。 您可以在本文末尾找到JCG路線圖。 該第一個發行版旨在提供項目模板-Web應用程序的體系結構。 …

關于如何用od反匯編win32 控制臺程序

*********************************************************** 如何用od反匯編win32 控制臺程序(類似dos程序&#xff09;呢&#xff1f;*********************************************************** 注&#xff1a;od是用來調試win32程序的 1.反編譯win32 控制臺程序&…

Chrome/Chromium HTML5 video 視頻播放硬件加速

Chromium站點上有個大致的框圖。描寫敘述了Chromium的video在各個平臺 - 包含Android - 上是怎樣使用硬件資源來做視頻編解碼加速的&#xff1a; 而依據Android Kitkat上的Chromium代碼分析&#xff0c;HTML5 video播放硬件加速&#xff0c;終于是使用MediaCodec.java來利用本地…

.net mvc結合微軟提供的FormsAuthenticationTicket登陸

一、Web.config <system.web><compilation debug"true" targetFramework"4.5" /><httpRuntime targetFramework"4.5" /><authentication mode"Forms"><forms loginUrl"/Sign/SignIn" defaultUrl…

vc6.o--fatal error C1010錯誤的解決

當編譯c文件時&#xff0c;出錯信息為&#xff1a;fatal error C1010: unexpected end of file while looking for precompiled header directive 解決方案&#xff1a; 1、如果發生錯誤的文件是由其他的C代碼文件添加進入當前工程而引起的&#xff0c;則AltF7進入當前工程的…

具有Java 7中自動資源管理功能的GC

這篇文章簡要概述了Java 7中引入的稱為自動資源管理或ARM的新功能。 文章探討了ARM如何減少開發人員為有效釋放分配的資源的JVM堆而必須編寫的代碼。 Java編程語言中編程的最甜蜜之處之一是對象取消分配的自動處理。 在Java世界中&#xff0c;這通常被稱為垃圾收集。 基本上&am…

PHP學習筆記(六)

《Wordpress 50個過濾鉤子》 1-10 過濾鉤子是一類函數&#xff0c;wordpress執行傳遞和處理數據的過程中&#xff0c;在針對這些數據做出某些動作之前的特定點執行。本質上&#xff0c;就是在wordpress輸出之前&#xff0c;將對瀏覽數據做出反應。 添加過濾鉤子&#xff1a; ad…

JS 操作 radio input(cc問卷管理)

1、選中特定的單選按鈕 function showDetail(content){$("input[name^radio]").removeAttr("checked");for(var i0;i<content.length;i){$("#radio"(i1)content.substr(i,1)).attr("checked","checked");} }2、手動添加問…

國內外著名黑客雜志

國外黑客雜志&#xff1a; 《phrack》黑客雜志 http://www.phrack.org 《phrack》創刊于80年代&#xff0c;是世界級的頂級黑客雜志&#xff0c;每年只有一期&#xff0c;現已出了65期&#xff0c;國人似乎至今只有三人在上面發表發表文章&#xff0c;三人好像都是綠盟的人&…

團體項目隨筆

我們的團體項目不僅在在課堂上討論了很久&#xff0c;課后也是幾經討論。每個人都有不同的想法我特別想做一個基于Web編寫的驢客網&#xff0c;因為基于個人需求&#xff0c;在最終的討論中被斃掉。 我們組最終的的討論結果是寫個游戲&#xff0c;關于游戲的發展&#xff0c;這…

Apache Lucene拼寫檢查器的“您是不是要”功能

Google的“您是不是要”功能 在上一篇文章中對Lucene進行了介紹之后 &#xff0c;現在是時候提高它&#xff0c;創建一個更復雜的應用程序了。 您肯定最熟悉Google的“您是不是要”功能&#xff08;其他搜索引擎也支持此功能&#xff09;。 這是一個例子&#xff1a; Lucene …

Android-做個性化的進度條

1.案例效果圖 2.準備素材 progress1.png(78*78) progress2.png(78*78) 3.原理 采用一張圖片作為ProgressBar的背景圖片(一般采用顏色比較淺的)。另一張是進度條的圖片(一般采用顏色比較深的圖片)。進度在滾動時&#xff1a;進度圖片逐步顯示&#xff0c;背景圖片逐…

匯編小記16/3/27

最后更新2016-03-27 21:05:06 [address]與[bx] [address] 在debug中mov ax,[0] 等價于mov ax,ds:[0] [0]表示內存偏移地址 但是在masm匯編解釋器中&#xff0c;mov ax,[0] 等價于mov ax,0 [0]表示常量0 [bx] mov ax,[bx] 表示 bx存放的數據為一個偏移地址&#xff0c;段…

ConcurrentLinkedHashMap v 1.0.1發布

大家好&#xff0c;我們發布了并發LinkedHashMap實現的1.0.1版本。 在最新版本中&#xff0c;已進行了一些較小的修改&#xff0c;以在多個線程遍歷映射的元素時提高性能。 最新版本還引入了可插拔驅逐策略。 當然&#xff0c;您可以實現自定義逐出策略&#xff0c;也可以將它…

BOMbing The System

roy g bivFebruary 2011 [Back to index] [Comments (0)] What is a BOM? Why should we care? Great, can we do that? Okay, lets do it! Unicode in files Greets to friendly people (A-Z) What is a BOM? Its not the thing that explodes. Thats a BOMB. Heh. BO…

鳥哥的linux私房菜學習筆記 ---第7章-2

1,文件內容查閱的命令: cat ,tac nl,more, less,head,tail ,od 文件的查閱參數,顯示行號如何顯示行號 nl 中的所有參數都是關于如何顯示行號的 這里面less的功能更多,更靈活 :空格 下一頁 pageup上一頁 pagedown 下一頁 /string 字符串查詢 ?string 反向字符串查詢 man的命…

HDU - 4497 GCD and LCM

題意&#xff1a;給出三個數的gcd,lcm&#xff0c;求這三個數的全部的可能 思路 &#xff1a;設x,y,z的gcd為d&#xff0c;那么設xd*a&#xff0c;yd*b&#xff0c;zd*c。a&#xff0c;b。c肯定是互質的。那么lcmd*a*b*c,所以我們能夠得到a*b*clcm/gcdans,將ans分解因數后&…

Java Lambda語法替代

關于lambda-dev郵件列表的討論已經開始解決lambdas /函數文字的Java語言語法應該是什么樣的問題。 讓我們看一個稍微平凡的例子&#xff0c;然后嘗試弄清楚問題。 Perl的人有一個很好的例子&#xff0c;說明以某種功能性的方式使用函數引用–他們稱其為Schwartzian變換&#xf…