上海企业建站方案,获取网站的路径,正在跳转页面,高港区住房和城乡建设局网站jta atomikos在本教程中#xff0c;我们将向您展示如何使用Atomikos Transaction Manager在Tomcat服务器中实现JTA多个资源事务。 Atomicos事务管理器为分布式事务提供支持。 这些是多阶段事务#xff0c;通常使用多个数据库#xff0c;必须以协调的方式提交。 分布式事务由… jta atomikos 在本教程中我们将向您展示如何使用Atomikos Transaction Manager在Tomcat服务器中实现JTA多个资源事务。 Atomicos事务管理器为分布式事务提供支持。 这些是多阶段事务通常使用多个数据库必须以协调的方式提交。 分布式事务由XA standard描述。 XA控制事务管理器例如Atomikos如何告知数据库作为什么事务的一部分正在进行的工作以及如何在每个事务结束时执行两阶段提交2PC协议。 在这里我们将创建映射到两个不同数据库的简单实体类并尝试使用一个分布式事务将这些类的对象持久保存到数据库中。 我们还将看到当基础事务之一回滚时会发生什么。 我们首选的开发环境是Eclipse 。 我们正在使用Eclipse Juno4.2版本以及Maven Integration插件版本3.1.0。 您可以从Eclipse的这里从和Maven Eclipse插件这里 。 用于Eclipse的Maven插件的安装不在本教程的讨论范围之内因此不再讨论。 我们还使用Spring 3.2.3和JDK 7_u_21。 Tomcat 7是使用的应用程序服务器。 Hibernate版本为4.1.9示例中使用的数据库为MySQL Database Server 5.6。 让我们开始 1.创建一个新的Maven项目 转到文件-项目- Maven- Maven项目。 在向导的“选择项目名称和位置”页面中确保未选中 “创建简单项目跳过原型选择”选项单击“下一步”以继续使用默认值。 在这里必须添加用于创建Web应用程序的Maven原型。 单击“添加原型”并添加原型。 将“ Archetype组ID”变量设置为org.apache.maven.archetypes 将“ Archetype构件ID”变量设置为maven-archetype-webapp 将“ Archetype版本”设置为1.0 。 点击“确定”继续。 在向导的“输入工件ID”页面中您可以定义项目的名称和主程序包。 将“ Group Id”变量设置为com.javacodegeeks.snippets.enterprise 将“ Artifact Id”变量设置为springexample 。 前面提到的选择将主项目程序包组成为com.javacodegeeks.snippets.enterprise.springexample 项目名称为springexample 。 将“ Package”变量设置为war 以便创建一个war文件以部署到tomcat服务器。 点击“完成”退出向导并创建您的项目。 Maven项目结构如下所示 它由以下文件夹组成 / src / main / java文件夹其中包含应用程序动态内容的源文件 / src / test / java文件夹包含用于单元测试的所有源文件 / src / main / resources文件夹包含配置文件 / target文件夹包含已编译和打包的可交付成果 / src / main / resources / webapp / WEB-INF文件夹包含Web应用程序的部署描述符 pom.xml是项目对象模型POM文件。 包含所有项目相关配置的单个文件。 2.添加Spring 3.2.3依赖项 在POM编辑器的“概述”页面上找到“属性”部分然后执行以下更改 创建一个新属性名称为org.springframework.version 值3.2.3RELEASE 。 导航到POM编辑器的“依赖关系”页面并创建以下依赖关系您应在该页面的“依赖关系详细信息”部分的“ GroupId”“工件ID”和“版本”字段中进行填充 组ID org.springframework工件ID spring-web版本 $ {org.springframework.version} 另外您可以在Maven的pom.xml文件中添加Spring依赖项方法是直接在POM编辑器的“ Pom.xml”页面上对其进行编辑如下所示 pom.xml project xmlnshttp://maven.apache.org/POM/4.0.0; xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.javacodegeeks.snippets.enterprise/groupIdartifactIdspringexample/artifactIdversion0.0.1-SNAPSHOT/versiondependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion${spring.version}/version/dependency/dependenciespropertiesspring.version3.2.3.RELEASE/spring.version/properties
/project 如您所见Maven以声明方式管理库依赖关系。 创建本地存储库默认情况下位于{user_home} /。m2文件夹下所有必需的库都从公共存储库下载并放置在该库中。 此外库内的依赖关系会自动解决和处理。 3.添加所有必需的依赖项 此处设置了设置atomosos事务管理器所需的所有依赖项。 pom.xml project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.javacodegeeks.snippets.enterprise/groupIdartifactIdspringexample/artifactIdpackagingwar/packagingversion0.0.1/versionnamespringexample Maven Webapp/nameurlhttp://maven.apache.org/urlbuildfinalNamespringexample/finalName/builddependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-tx/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-orm/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.hibernate/groupIdartifactIdhibernate-entitymanager/artifactIdversion${hibernate.version}/versionexclusionsexclusiongroupIdcglib/groupIdartifactIdcglib/artifactId/exclusionexclusiongroupIddom4j/groupIdartifactIddom4j/artifactId/exclusion/exclusions/dependencydependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion3.0.1/versionscopeprovided/scope/dependencydependencygroupIdcom.atomikos/groupIdartifactIdtransactions-jta/artifactIdversion${atomikos.version}/version/dependencydependencygroupIdcom.atomikos/groupIdartifactIdtransactions-jdbc/artifactIdversion${atomikos.version}/version/dependencydependencygroupIdcom.atomikos/groupIdartifactIdtransactions-hibernate3/artifactIdversion${atomikos.version}/versionexclusionsexclusionartifactIdhibernate/artifactIdgroupIdorg.hibernate/groupId/exclusion/exclusions/dependencydependencygroupIddom4j/groupIdartifactIddom4j/artifactIdversion1.6.1/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.25/version/dependency/dependenciespropertiesspring.version3.2.3.RELEASE/spring.versionhibernate.version4.1.9.Final/hibernate.versionatomikos.version3.8.0/atomikos.version
/properties/project4.创建实体类 EmployeeA.java和EmployeeB.java是Entity类。 他们使用javax.persistence批注映射到不同数据库中的表EMPLOYEEA和EMPLOYEEB 。 特别地 Entity注释指定每个类是一个实体。 Table注释指定带注释的实体的主表。 Column批注用于为持久字段指定一个映射列而Id批注指定每个实体的主键字段。 EmployeeA.java package com.javacodegeeks.snippets.enterprise.model;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;Entity
Table(name EMPLOYEEA)
public class EmployeeA {IdColumn(name ID, nullable false)private String id;Column(name NAME, nullable false)private String name;Column(name AGE, nullable false)private long age;public EmployeeA() {}public String getId() {return id;}public void setId(String id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public long getAge() {return age;}public void setAge(long age) {this.age age;}} EmployeeB.java package com.javacodegeeks.snippets.enterprise.model;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;Entity
Table(name EMPLOYEEB)
public class EmployeeB {IdColumn(name ID, nullable false)private String id;Column(name NAME, nullable false)private String name;Column(name AGE, nullable false)private long age;public EmployeeB() {}public String getId() {return id;}public void setId(String id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public long getAge() {return age;}public void setAge(long age) {this.age age;}}5.创建DAO类 实现的数据访问对象是EmployeeADAOImpl.java和EmployeeBDAOImpl.java类。 它们使用Service注释进行注释表明它们是Spring Bean因此允许Spring自动检测它们。 它们都使用javax.persistence.EntityManager与数据库进行交互。 EntityManager实例与持久性上下文关联。 持久性上下文是一组实体实例其中对于任何持久性实体标识都有一个唯一的实体实例。 在持久性上下文中管理实体实例及其生命周期。 EntityManager API用于创建和删除持久实体实例通过其主键查找实体以及查询实体。 在persistence.xml文件中配置了EntityManager 对此进行了描述 在第8.1段中。 可以由给定EntityManager实例管理的实体集由持久性单元定义。 持久性单元定义了与应用程序相关或分组的所有类的集合这些类必须在它们到单个数据库的映射中共置。 EntityManager通过PersistenceContext注释注入到每个DAO中在该注释中设置了每个持久性单元的名称如persistence.xml文件中所定义。 在两个DAO中都实现了一种基本的持久方法即使用EntityManager的persist(Object entity) API方法来创建数据库的对象。 DAO及其接口如下所示 雇员ADAO.java package com.javacodegeeks.snippets.enterprise.dao;import com.javacodegeeks.snippets.enterprise.model.EmployeeA;public interface EmployeeADAO {void persistEmployee(EmployeeA employee);
} 雇员ADAO Impl.java package com.javacodegeeks.snippets.enterprise.dao;import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;import org.springframework.stereotype.Service;import com.javacodegeeks.snippets.enterprise.model.EmployeeA;Service
public class EmployeeADAOImpl implements EmployeeADAO {PersistenceContext(unitNamePersistenceUnitA)private EntityManager entityManager;public void persistEmployee(EmployeeA employee) {entityManager.persist(employee);}} 雇员BDAO .java package com.javacodegeeks.snippets.enterprise.dao;import com.javacodegeeks.snippets.enterprise.model.EmployeeB;public interface EmployeeBDAO {void persistEmployee(EmployeeB employee) throws Exception;} 雇员BDAO Impl.java package com.javacodegeeks.snippets.enterprise.dao;import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;import org.springframework.stereotype.Service;import com.javacodegeeks.snippets.enterprise.model.EmployeeB;Service
public class EmployeeBDAOImpl implements EmployeeBDAO {PersistenceContext(unitNamePersistenceUnitB)private EntityManager entityManager;public void persistEmployee(EmployeeB employee) throws Exception {entityManager.persist(employee);
// throw new Exception();}
}6.创建服务类 EmployeeADAOImpl.java和EmployeeBDAOImpl.java类被注入EmployeeServiceImpl.java类。 因此在此处实现的persistEmployees(EmployeeA employeeA, EmployeeB employeeB)方法中将调用DAO的方法来执行与数据库的基本交互。 EmployeeServiceImpl.java类也带有Service注释表明它是一个Spring Bean因此允许Spring自动检测到它。 Transactional批注放置在方法之前以表示在调用该方法时创建了一个事务。 该事务是全局容器管理的事务将在Spring配置文件中进行配置。 EmployeeService.java package com.javacodegeeks.snippets.enterprise.service;import com.javacodegeeks.snippets.enterprise.model.EmployeeA;
import com.javacodegeeks.snippets.enterprise.model.EmployeeB;public interface EmployeeService {void persistEmployees(EmployeeA employeeA, EmployeeB employeeB) throws Exception;} EmployeeServiceImpl.java package com.javacodegeeks.snippets.enterprise.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import com.javacodegeeks.snippets.enterprise.dao.EmployeeADAO;
import com.javacodegeeks.snippets.enterprise.dao.EmployeeBDAO;
import com.javacodegeeks.snippets.enterprise.model.EmployeeA;
import com.javacodegeeks.snippets.enterprise.model.EmployeeB;Service(employeeService)
public class EmployeeServiceImpl implements EmployeeService{AutowiredEmployeeADAO employeeADAO;AutowiredEmployeeBDAO employeeBDAO;Transactional(rollbackForException.class)public void persistEmployees(EmployeeA employeeA, EmployeeB employeeB) throws Exception {System.out.println(Persist A);employeeADAO.persistEmployee(employeeA);System.out.println(Persist A OK - persist B);employeeBDAO.persistEmployee(employeeB);System.out.println(Persist B okk);}}7.创建一个servlet以运行该应用程序 AppServlet.java类是一个简单的servlet它实现org.springframework.web.HttpRequestHandler并覆盖其handleRequest(HttpServletRequest req, HttpServletResponse resp) API方法。 EmployeeService通过Autowire注释注入到此处。 在handleRequest(HttpServletRequest req, HttpServletResponse resp) API方法中使用它来持久存储新的EmployeeA和新的EmployeeB对象。 如果该方法成功返回则该方法还返回一条成功消息如果该方法抛出异常则返回回滚消息。 AppServlet.java package com.javacodegeeks.snippets.enterprise.servlet;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.HttpRequestHandler;import com.javacodegeeks.snippets.enterprise.model.EmployeeA;
import com.javacodegeeks.snippets.enterprise.model.EmployeeB;
import com.javacodegeeks.snippets.enterprise.service.EmployeeService;Component(appServlet)
public class AppServlet implements HttpRequestHandler {Autowiredprivate EmployeeService employeeService;public void handleRequest(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {EmployeeA em1 new EmployeeA();em1.setId(123);em1.setName(John);em1.setAge(35);EmployeeB em2 new EmployeeB();em2.setId(123);em2.setName(Mary);em2.setAge(31);try {employeeService.persistEmployees(em1, em2);resp.setContentType(text/html);PrintWriter out resp.getWriter();out.println(html);out.println(head);out.println(titleHello World!/title);out.println(/head);out.println(body);out.println(h1Java Code Geeks /h1);out.println(h2Both employees are inserted!/h2);out.println(/body);out.println(/html);} catch (Exception e) {resp.setContentType(text/html);PrintWriter out resp.getWriter();out.println(html);out.println(head);out.println(titleHello World!/title);out.println(/head);out.println(body);out.println(h1Java Code Geeks /h1);out.println(h2Transaction Rollback!/h2);out.println(/body);out.println(/html);e.printStackTrace();}}
}8.配置应用程序 8.1配置持久性单元 如上所述在persistence.xml文件中配置了每个数据库的entityManager和与其关联的持久性单元。 在这里我们定义了两个持久性单元。 在每个persistence-unit元素中我们定义与持久性单元关联的实体类。 hibernate.transaction.manager_lookup_class属性设置为com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup 。 hibernate.transaction.factory_class属性设置为org.hibernate.transaction.CMTTransactionFactory 。 persistence.xml ?xml version1.0 encodingUTF-8?
persistence version2.0xmlnshttp://java.sun.com/xml/ns/persistence xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsdpersistence-unit namePersistenceUnitA transaction-typeJTAclasscom.javacodegeeks.snippets.enterprise.model.EmployeeA/classpropertiesproperty namehibernate.transaction.manager_lookup_classvaluecom.atomikos.icatch.jta.hibernate3.TransactionManagerLookup /property namehibernate.transaction.factory_classvalueorg.hibernate.transaction.CMTTransactionFactory //properties/persistence-unitpersistence-unit namePersistenceUnitB transaction-typeJTAclasscom.javacodegeeks.snippets.enterprise.model.EmployeeB/classpropertiesproperty namehibernate.transaction.manager_lookup_classvaluecom.atomikos.icatch.jta.hibernate3.TransactionManagerLookup /property namehibernate.transaction.factory_classvalueorg.hibernate.transaction.CMTTransactionFactory //properties/persistence-unit/persistence8.2配置Spring容器 applicationContext.xml文件是Spring的配置文件。 context:component-scan/元素用于设置包含容器必须扫描以检测Spring Bean的所有类的包。 还使用tx:annotation-driven/元素以便Spring具有Transactional感知并可以检测Transactional注释以配置具有事务行为的适当bean。 jta-transaction-manager/元素用于检测基础服务器并选择可用于平台的事务管理器。 在dataSourceA和dataSourceB bean中我们定义了数据源。 com.atomikos.jdbc.AtomikosDataSourceBean是此处设置的类。 它使用支持Atomikos JTA的连接池。 它具有两个要配置的属性。 com.mysql.jdbc.jdbc2.optional.MysqlXADataSource类设置为xaDataSourceClass属性而在xaProperties我们可以设置属性名称值对以配置XADataSource 。 在entityManagerFactoryA和entityManagerFactoryB bean中我们设置了org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean类。 它是一个FactoryBean 可根据JPA的标准容器引导合同创建JPA EntityManagerFactory 。 我们可以在其persistenceXmlLocation属性中设置persistence.xml位置。 我们可以在persistenceUnitName属性中设置用于创建此EntityManagerFactory的持久性单元的名称。 datasource属性是对适当的dataSource bean的引用。 jpaVendorAdapter属性设置为org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter 它是Hibernate EntityManager的实现。 最后使用org.springframework.transaction.jta.JtaTransactionManager定义transactionManager bean。 它包含两个要配置的属性。 transactionManager和atomikosTransactionManager 。 它们分别引用了com.atomikos.icatch.jta.UserTransactionManager类和com.atomikos.icatch.jta.J2eeUserTransaction类的两个bean。 applicationContext.xml beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:phttp://www.springframework.org/schema/pxmlns:aophttp://www.springframework.org/schema/aop xmlns:contexthttp://www.springframework.org/schema/contextxmlns:jeehttp://www.springframework.org/schema/jee xmlns:txhttp://www.springframework.org/schema/txxmlns:taskhttp://www.springframework.org/schema/taskxsi:schemaLocationhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsdcontext:component-scan base-packagecom.javacodegeeks.snippets.enterprise.* /tx:annotation-driven /tx:jta-transaction-manager /bean iddataSourceA classcom.atomikos.jdbc.AtomikosDataSourceBean init-methodinit destroy-methodcloseproperty nameuniqueResourceNamevalueDataSourceA/value/propertyproperty namexaDataSourceClassNamevaluecom.mysql.jdbc.jdbc2.optional.MysqlXADataSource/value/propertyproperty namexaPropertiespropsprop keydatabaseNamecompanyA/propprop keyserverNamelocalhost/propprop keyport3306/propprop keyuserroot/propprop keypasswordroot/propprop keyurljdbc:mysql://localhost:3306/companyA/prop/props/propertyproperty nameminPoolSizevalue1/value/property
/beanbean iddataSourceB classcom.atomikos.jdbc.AtomikosDataSourceBean init-methodinit destroy-methodcloseproperty nameuniqueResourceNamevalueDataSourceB/value/propertyproperty namexaDataSourceClassNamevaluecom.mysql.jdbc.jdbc2.optional.MysqlXADataSource/value/propertyproperty namexaPropertiespropsprop keydatabaseNamecompanyB/propprop keyserverNamelocalhost/propprop keyport3306/propprop keyuserroot/propprop keypasswordroot/propprop keyurljdbc:mysql://localhost:3306/companyB/prop/props/propertyproperty nameminPoolSizevalue1/value/property
/beanbean identityManagerFactoryA classorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanproperty namepersistenceXmlLocationvalueclasspath*:persistence.xml/value/propertyproperty namepersistenceUnitName valuePersistenceUnitA /property namedataSource refdataSourceA /property namejpaVendorAdapterbean classorg.springframework.orm.jpa.vendor.HibernateJpaVendorAdapterproperty nameshowSql valuetrue /property namedatabasePlatform valueorg.hibernate.dialect.MySQL5InnoDBDialect //bean/property/beanbean identityManagerFactoryB classorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanproperty namepersistenceXmlLocationvalueclasspath*:persistence.xml/value/propertyproperty namepersistenceUnitName valuePersistenceUnitB /property namedataSource refdataSourceB /property namejpaVendorAdapterbean classorg.springframework.orm.jpa.vendor.HibernateJpaVendorAdapterproperty nameshowSql valuetrue /property namedatabasePlatform valueorg.hibernate.dialect.MySQL5InnoDBDialect //bean/property/beanbean idatomikosTransactionManager classcom.atomikos.icatch.jta.UserTransactionManager init-methodinit destroy-methodcloseproperty nameforceShutdown valuefalse //beanbean idatomikosUserTransaction classcom.atomikos.icatch.jta.J2eeUserTransactionproperty nametransactionTimeout value300 //beanbean idtransactionManager classorg.springframework.transaction.jta.JtaTransactionManagerdepends-onatomikosTransactionManager,atomikosUserTransactionproperty nametransactionManager refatomikosTransactionManager /property nameuserTransaction refatomikosUserTransaction /property nameallowCustomIsolationLevels valuetrue //bean/beans8.3配置Web应用程序部署描述符 web.xml文件是定义服务器需要了解的有关应用程序的所有内容的文件。 此处设置了Servlet和其他组件例如过滤器或侦听器初始化参数容器管理的安全性约束资源欢迎页面等。 servlet元素声明AppServlet 并声明实现它的org.springframework.web.context.support.HttpRequestHandlerServlet类。 servlet-mapping元素指定在浏览器中调用servlet的/appServlet URL模式。 在context-param元素中我们设置了contextConfigLocation参数其中定义了applicationContext.xml文件位置。 在listener元素中将Bootstrap侦听器设置为启动Spring的applicationContext.xml 。 在两个数据源中都设置了resource-ref元素以定义对资源的引用查找名称。 这允许Servlet代码通过在部署时映射到实际位置的“虚拟”名称来查找资源。 web.xml ?xml version1.0 encodingUTF-8?
web-app xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlnshttp://java.sun.com/xml/ns/javaee xmlns:webhttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsdxsi:schemaLocationhttp://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsdidWebApp_ID version3.0display-namejavacodegeeks/display-namecontext-paramparam-namecontextConfigLocation/param-nameparam-value/WEB-INF/applicationContext.xml/param-value/context-paramlistenerlistener-classorg.springframework.web.context.ContextLoaderListener/listener-class/listenerservletdisplay-nameAppServlet/display-nameservlet-nameappServlet/servlet-nameservlet-classorg.springframework.web.context.support.HttpRequestHandlerServlet/servlet-class/servletservlet-mappingservlet-nameappServlet/servlet-nameurl-pattern/appServlet/url-pattern/servlet-mappingresource-refdescriptionMySQL DS/descriptionres-ref-namejdbc/DataSourceA/res-ref-nameres-typejavax.sql.DataSource/res-typeres-authContainer/res-auth/resource-refresource-refdescriptionMySQL DS/descriptionres-ref-namejdbc/DataSourceB/res-ref-nameres-typejavax.sql.DataSource/res-typeres-authContainer/res-auth/resource-ref/web-app9.在Tomcat中运行应用程序 为了在tomcat中运行应用程序我们首先必须构建项目。 产生的war位于tomcat的webapps文件夹中。 然后我们启动服务器。 撞上之后 localhost:8080/springexample/appServlet 在浏览器中我们可以检查在MySQL这两个数据库 companyA和companyB表EmployeeA和EmployeeB有一个记录。 浏览器中返回的消息是以下消息 10.回滚情况 现在让我们看看如果两个事务之一失败了会发生什么。 我们将更改EmployeeBDAOImpl.java类的persistEmployee(EmployeeB employee)方法以引发Exception 。 雇员BDAO Impl.java package com.javacodegeeks.snippets.enterprise.dao;import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;import org.springframework.stereotype.Service;import com.javacodegeeks.snippets.enterprise.model.EmployeeB;Service
public class EmployeeBDAOImpl implements EmployeeBDAO {PersistenceContext(unitNamePersistenceUnitB)private EntityManager entityManager;public void persistEmployee(EmployeeB employee) throws Exception {
// entityManager.persist(employee);throw new Exception();}
} 我们再次构建该项目并将新的war文件放入tomcat的webapps文件中。 再次启动tomcat之后结果如下 这是由于事务之一引发异常而导致分布式事务也会回滚。 这是使用Atomikos事务管理器在Tomcat服务器中进行JTA多个资源事务的示例。 下载本教程的Eclipse项目 SpringJTAatomicosTomcatExample.zip 翻译自: https://www.javacodegeeks.com/2013/07/spring-jta-multiple-resource-transactions-in-tomcat-with-atomikos-example.htmljta atomikos