gwt 同步和异步_GWT Spring和Hibernate进入数据网格世界

gwt 同步和异步

利用Infinispan Data Grid的功能最大化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项目的依赖性。 以下jars应该包含在项目的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集成教程
  • Spring 3 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

gwt 同步和异步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java分页 jar_零基础学java之javaEE,分页

【分页】一 分页1.1分页概念引入什么是分页?分页(英语&#xff1a;Paging)&#xff0c;是一种操作系统里存储器管理的一种技术&#xff0c;可以使电脑的主存可以使用存储在辅助存储器中的数据。操作系统会将辅助存储器(通常是磁盘)中的数据分区成固定大小的区块&#xff0c;称…

查看修改MySQL字符集

查看修改MySQL字符集 http://blog.sina.com.cn/s/blog_70ac6bec01016fts.html 查看修改MySQL字符集 (2012-08-22 09:53:21) 转载▼标签&#xff1a; 字符集 mysql数据库 mysql字符集查看 mysql启动命令 修改mysql字符集 分类&#xff1a; 网站开发MySQL字符集多种多样…

java上传文件需要的依赖_SpringBoot使用commons-fileupload上传文件的类

网上找了一些&#xff0c;都是基本介绍&#xff0c;没有直接就可以使用类&#xff0c;在实际工作当中都有适合当前项目的上传文件的方法&#xff0c;本人写了一个类&#xff0c;比较基础&#xff0c;但呆以满足项目的上传文件功能&#xff0c;使用了commons-fileupload这个组件…

ArcGIS for Android示例解析之离线地图-----LocalTiledLayer

转自&#xff1a;http://blog.csdn.net/wozaifeiyang0/article/details/7327423 LocalTiledLayer 看到这个标题是否是很激动&#xff0c;如题&#xff0c;该示例就是添加一个离线地图&#xff0c;这应该是很多开发人员期盼已久的功能了吧&#xff0c;正式版一处这个应该是一个很…

md5 算法java实现_java实现MD5算法

import java.security.MessageDigest;/** 加密工具*author 刘彦青***/public class EncryptUtil {/** MD5加密** param jiami* 源字符串* return 加密后的字符串 */public final static String md5(String jiami) {char hexDigits[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C,…

wikioi 1017--乘积最大

给定一个数串&#xff0c;以及K&#xff0c;求对这个数串K划分的乘积最大值。 DP思路&#xff1a;一开始肯定想到的是递归&#xff0c;假设在某两个字符间有一个乘号&#xff0c;那么乘积最大就是乘号两边的区间接着划分的乘积最大值。 于是状态空间表示如下dp[i][k]表示从0~i之…

java在线找错_平台配置及测试错误提示及解决方案

平台配置错误提示及解决方案开发者在点击提交服务的时候可能会遇到以下各种各样的问题&#xff0c;本文列举出部分平台会弹出的提示&#xff0c;以便解决提交出现的问题。1、 请完成分发国家配置原因&#xff1a;未选择分发国家或未保存解决&#xff1a;在配置-发布国家中&…

d3 mysql_javascript – 在d3可视化中访问MySQL数据库

我需要一些关于d3和MySQL的帮助.以下是我的问题&#xff1a;我有数据存储在MySQL中(例如&#xff1a;关键字及其频率).我现在想用d3将其可视化.据我所知,d3需要json文件作为输入.我的问题是&#xff1a;如何从d3脚本访问这个MySQL数据库&#xff1f;我能想到的一种方法是&#…

resteasy_Tomcat 7上具有RESTeasy JAX-RS的RESTful Web服务– Eclipse和Maven项目

resteasy开发Web服务的RESTful方法不断受到越来越多的关注&#xff0c;并且似乎正在将SOAP淘汰。 我不会讨论哪种方法更好&#xff0c;但是我相信我们都同意REST更轻量级。 在本教程中&#xff0c;我将向您展示如何使用RESTeasy开发RESTful服务以及如何将它们部署在Tomcat服务器…

java httpserver 多个接口_多个Servlet之间数据共享实现方案

1.数据共享&#xff1a;OneServlet工作完毕后&#xff0c;将产生数据交给TwoServlet来使用Servlet规范中提供四种数据共享方案1.ServletContext接口2.Cookie类3.HttpSession接口4.HttpServletRequest接口ServletContext接口:1.介绍&#xff1a;1)来自于Servlet规范中一个接口。…

【Java心得总结六】Java容器中——Collection

在【Java心得总结五】Java容器上——容器初探这篇博文中&#xff0c;我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库。而在这篇博文中&#xff0c;我想着重对容器类库中的Collection容器做一个着重的探索与总结。 Collection&#xff1a;一个独立元素的序…

php 文章读取_php实现获取文章内容第一张图片的方法

本文实例讲述了php实现获取文章内容第一张图片的方法。分享给大家供大家参考。具体分析如下&#xff1a;采用php获取文章内容的第一张图片方法非常的简单&#xff0c;我们最常用的是使用正则了&#xff0c;感兴趣的朋友可以参考一下下面这段代码。以下是关于选取文章中第一张图…

相对路径

当前程序的所在目录textBox1.Text AppDomain.CurrentDomain.BaseDirectory; 返回D:\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\http://www.cnblogs.com/SissyNong/archive/2009/09/22/1571752.html 当前程序的完整路径textBox1.Text System.Diagnostics.…

php怎么传json数据_php和js如何通过json互相传递数据相关问题探讨

当我们在结合php和javascript实现某些功能时&#xff0c;经常会用到json。json是js的一种数据格式&#xff0c;可以直接被js解析。而php无法直接读取json数据&#xff0c;但是php提供了json_decode函数来对json数据进行转化&#xff0c;从而可以被php脚本访问。同时&#xff0c…

Java 8中的策略模式

这是两个有关如何使用Java 8功能样式以及Cyclops模式匹配和Hamcrest库来实现策略模式设计的示例。 PrintDependingOnInput方法是一种策略&#xff0c;该策略将根据传递的日志在System.println中显示一些消息。 AddPrefix是另一种策略&#xff0c;它将根据邮件内容为邮件添加前…

昨天帮同学的学校写了首校歌

转载于:https://www.cnblogs.com/del/p/3792526.html

php做一个微信退款,PHP实现微信申请退款流程实例代码

前面讲了怎么实现微信支付&#xff0c;详见博文&#xff1a;php实现微信支付(jsapi支付)流程 和ThinkPHP中实现微信支付(jsapi支付)流程。由于业务需求&#xff0c;还需要有微信退款&#xff0c;经过研究和摸索&#xff0c;也终于搞定了。前期准备&#xff1a;当然是搞定了微信…

gwt格式_使用Spring Security保护GWT应用程序的安全

gwt格式在本教程中&#xff0c;我们将看到如何将GWT与Spring的安全模块&#xff08;即Spring Security&#xff09;集成。 我们将看到如何保护GWT入口点&#xff0c;如何检索用户的凭据以及如何记录各种身份验证事件。 此外&#xff0c;我们将实现自定义身份验证提供程序&#…

php制图汉字,PHP用imageTtfText函数在图片上写入汉字

PHP绘图&#xff0c;imageString()这个函数并不支持汉字的绘制。这往往会给入门者当头一棒&#xff0c;不过不要着急&#xff0c;因为还有一个imageTtfText()函数&#xff0c;这个函数能绘制UTF-8编码的字符串&#xff0c;当然可以绘制汉字了。参数&#xff1a;$size 字体大小&…

K-Means算法Demo

简介&#xff1a;本Demo是参照这个网站上的Demo自己用Java实现的。将Java打包为Jar&#xff0c;再将Jar转为exe&#xff0c;源代码及程序Demo下载请点我。 K-Means算法简介 我尽量用通俗易懂但不规范的语言来描述K-Means算法。 K-Means算法是数据挖掘十大算法之一&#xff0c;是…