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 同步和异步

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

  1. GWT Spring和Hibernate进入数据网格世界

    利用Infinispan数据网格的功能最大化Hibernate性能. 一个GWT , Spring , JPA , Hibernate , Infinispan集成教程. 在本教程中,我们将讨论如何将 ...

  2. linux socket 阻塞与非阻塞,同步与异步

    在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步:       所谓同步,就是在c端发出 ...

  3. http 请求 与其同步与异步请求的通透讲解

    http请求可以是基于webkit的浏览器或者web组件如:webview(在移动平台,android iOS等)发送的:也可以是任何程序或者代码段发出的:也可以这么说任何程序都可以自主发送http. ...

  4. socket阻塞与非阻塞,同步与异步

    转自:http://blog.csdn.net/hguisu/article/details/7453390 socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理解 在进行网 ...

  5. 阻塞与非阻塞、同步与异步、I/O模型

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步: 所谓同步,就是在c端 ...

  6. scrapy | 爬取伯乐在线全部博文(xpath/css/itemload三种提取方法,同步、异步方式存入MySQL)

    1.目标 伯乐在线网站地址:http://blog.jobbole.com/all-posts/ 爬取伯乐在线的所有文章信息,包括图片网址,标题,发表日期,标签,点赞数,评论数等 将爬取的数据保存至数 ...

  7. java同步变异步框架_java-如何使用Spring配置异步和同步事件发布者

    我正在尝试使用spring事件实现事件框架,后来我知道spring事件框架的默认行为是sync.但是在春季上下文初始化期间,如果它找到ID为applicationEventMulticaster的be ...

  8. 利用Spring框架封装的JavaMail现实同步或异步邮件发送

    利用Spring框架封装的JavaMail现实同步或异步邮件发送 作者:张纪豪 J2EE简单地讲是在JDK上扩展了各类应用的标准规范,邮件处理便是其中一个重要的应用.它既然是规范,那么我们就可以通过J ...

  9. boot定时任务开启和关闭 spring_SpringBoot中的定时任务的同步与异步你确定真的知道?...

    定时任务调度功能在我们的开发中是非常常见的,随便举几个例子:定时清除一些过期的数据,定时发送邮件等等,实现定时任务调度的方式也十分多样,本篇文章主要学习各种实现定时任务调度方式的优缺点,以便为日后选择 ...

最新文章

  1. Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)的基本操作
  2. 数据之“星”汇聚,第三届「星斗奖」申报正式启动!
  3. Twitter的分布式自增ID算法snowflake (Java版)
  4. python中的栈结构_python中有栈吗
  5. OpenCV向JNI层的参数转换
  6. vocabulary of ERP
  7. web 自动化测试 selenium基础到应用(目录)
  8. 07_支持向量机2_统计学习方法
  9. 如何获取一个随机数:10 - 99
  10. 【求最大公共子串长度】
  11. MP3 Lame 转换 参数 设置(转)
  12. 老男孩python全栈3期_Python/Python3视频教程2017老男孩Python全栈工程师3期基础Python3.5...
  13. stm32f407与计算机的usb通讯,STM32F407 USB通信程序 USB Device 虚拟串口 CDC类 Cubemx生成...
  14. 原来华为手机音量键这么厉害!除了调声音,还有5个隐藏功能
  15. Visual Studio 2005 Service Pack 1 (SP1)
  16. 用python的turtle库绘制风车动画
  17. 基于PHP+MySQL托管中心管理系统的设计与实现
  18. 龙博方案网Big Faceless Java图形展现控件详细介绍及下载
  19. java使用SAXReader读取xml文件
  20. 电路实验一阶电路误差分析_常见滤波电路分析技巧

热门文章

  1. 实体类?Dao接口?Mapper映射文件?都别写了!!!用这种方法就可以
  2. 今天就唠叨唠叨吧……
  3. Photoshop图像修饰工具
  4. java实现打印倒直角三角形
  5. aws使用技巧_AWS:避免那些“神圣的法案”时刻的一些技巧
  6. css外墙法_外墙设计模式示例
  7. gtest 测试部分_全部关于测试–第2部分
  8. javafx 调用接口_JavaFX技巧3:使用回调接口
  9. Java 11即将发布的功能–启动单文件源程序
  10. Java程序员应在2018年学习的3种JVM语言