-
Spring3.1+atomikos3.7实现JTA事务配置相关!5
最近公司项目整改,想为每个用户企业独立一个数据库(MySql5.0),于是使用threadLocal来实现数据源动态切换,但是随之而来的便是JTA事务的处理。
在网上找了很多资料,决定采用atomikos3.7来实现。
导入相关的JAR包后,配置了jta.properties文件:com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory com.atomikos.icatch.console_file_name = tm.out com.atomikos.icatch.log_base_name = tmlog com.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tm com.atomikos.icatch.console_log_level = INFO
jdbc.properties配置文件如下:
一个中心数据库logingwt和两个独立企业数据库test1,test2#MySQL jdbc.xaDataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource #CenterDB logingwt.uniqueResourceName=mysql/logingwt logingwt.url=URL=jdbc:mysql://localhost:3306/logingwt?useUnicode=true&characterEncoding=UTF-8;user=root;password=1234 #SolidDB test1 test1.uniqueResourceName=mysql/test1 test1.url=URL=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=UTF-8;user=root;password=1234 #SolidDB test2 test2.uniqueResourceName=mysql/test2 test2.url=URL=jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=UTF-8;user=root;password=1234
Spring配置文件如下:<?xml version="1.0" encoding="UTF-8"?> <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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop"> <context:annotation-config /> <context:component-scan base-package="login" /> <!-- 启动AspectJ支持 --> <aop:aspectj-autoproxy /> <!-- JDBC数据源配置 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>classpath:jdbc.properties</value> </property> </bean> <!-- XA Datasource --> <!-- 中心数据库 --> <bean id="logingwt" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="${logingwt.uniqueResourceName}" /> <property name="xaDataSourceProperties" value="${logingwt.url}" /> <property name="xaDataSourceClassName" value="${jdbc.xaDataSourceClassName}" /> <property name="validatingQuery" value="SELECT 1" /> </bean> <!-- 数据库test1 --> <bean id="test1" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="${test1.uniqueResourceName}" /> <property name="xaDataSourceProperties" value="${test1.url}" /> <property name="xaDataSourceClassName" value="${jdbc.xaDataSourceClassName}" /> <property name="validatingQuery" value="SELECT 1" /> </bean> <!-- 数据库test2 --> <bean id="test2" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="${test2.uniqueResourceName}" /> <property name="xaDataSourceProperties" value="${test2.url}" /> <property name="xaDataSourceClassName" value="${jdbc.xaDataSourceClassName}" /> <property name="validatingQuery" value="SELECT 1" /> </bean> <!-- 多数源映射关系 --> <bean id="dataSource" class="login.dataSourceConfig.DynamicDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <entry value-ref="logingwt" key="logingwt"></entry> <entry value-ref="test1" key="test1"></entry> <entry value-ref="test2" key="test2"></entry> </map> </property> <property name="defaultTargetDataSource" ref="logingwt" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan"> <list> <value>login.pojo</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hbm2ddl.auto">create</prop> <prop key="current_session_context_class">thread</prop> <prop key="javax.persistence.validation.mode">none</prop> <prop key="hibernate.connection.autocommit">false</prop> </props> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 配置atomikos的事务管理器 --> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown" value="true" /> </bean> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="300" /> </bean> <!-- spring的JTA事务管理器 --> <bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="atomikosTransactionManager" /> <property name="userTransaction" ref="atomikosUserTransaction" /> </bean> <!-- 配置事务拦截器 --> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="springTransactionManager" /> <!-- 配置事务属性 --> <property name="transactionAttributes"> <props> <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="create*">PROPAGATION_REQUIRED,-Exception</prop> </props> </property> </bean> <bean id="txProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <!-- 需要开启事务的bean的名称 --> <list> <value>*Service</value> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> <!-- 启动注解功能 --> <tx:annotation-driven transaction-manager="springTransactionManager" /> </beans>
其中hibernate采用注解方式来进行数据库映射。
但是一启动项目,便报错为:No properties path set - looking for transactions.properties in classpath... 10:47:14,291 INFO org.hibernate.impl.SessionFactoryImpl:927 - closing transactions.properties not found - looking for jta.properties in classpath... Using init file: /D:/MyWorkPlace/smartgwt/workspace/LoginGWT/war/WEB-INF/classes/jta.properties 10:47:14,306 ERROR org.springframework.web.context.ContextLoader:238 - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'BaseService' defined in file [D:\MyWorkPlace\smartgwt\workspace\LoginGWT\war\WEB-INF\classes\login\service\impl\BaseServiceImpl.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionInterceptor' defined in file [D:\MyWorkPlace\smartgwt\workspace\LoginGWT\war\WEB-INF\classes\applicationContext-common.xml]: Cannot resolve reference to bean 'springTransactionManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springTransactionManager' defined in file [D:\MyWorkPlace\smartgwt\workspace\LoginGWT\war\WEB-INF\classes\applicationContext-common.xml]: Cannot resolve reference to bean 'atomikosTransactionManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'atomikosTransactionManager' defined in file [D:\MyWorkPlace\smartgwt\workspace\LoginGWT\war\WEB-INF\classes\applicationContext-common.xml]: Invocation of init method failed; nested exception is com.atomikos.icatch.SysException: Error in init of UserTransactionServiceImp: com.atomikos.icatch.standalone.UserTransactionServiceFactory at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:900) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:455) at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:294) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:215) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:543) at org.mortbay.jetty.servlet.Context.startContext(Context.java:136) at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220) at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513) at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:463) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) at org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) at org.mortbay.jetty.Server.doStart(Server.java:222) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:667) at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:500) at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1055) at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:804) at com.google.gwt.dev.DevMode.main(DevMode.java:309)
请问这是为什么?
另外,如果将jta.properties更改为:com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory com.atomikos.icatch.console_file_name=tm.release.out com.atomikos.icatch.log_base_name=tm.releaselog com.atomikos.icatch.tm_unique_name=com.atomikos.spring.jdbc.tm.release com.atomikos.icatch.console_log_level=INFO
则启动时候不报错,但是JTA事务无法回滚,报错信息为:XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state
第一次做JTA,实在是没办法了。
2012年9月06日 11:22
2个答案 按时间排序 按投票排序
-
检查你的jta.properties文件的,每一行的末尾时候有多余的空格,删掉。
重点是这一行com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
末尾不能有空格2016年3月28日 20:07
-
我这篇文章有讲 Atomikos
http://jinnianshilongnian.iteye.com/blog/1439900
MySql存储引擎是InnoDB?? MyISAM不支持事务2012年9月06日 12:15
相关推荐
2. `applicationContext.xml`或对应的Java配置类:配置Spring的事务管理器和数据源,以及Atomikos相关的bean。 3. MyBatis的配置:定义SqlSessionFactory,并与Spring集成。 4. 示例代码:展示了如何在方法上使用`@...
标题中的“Spring3.1+Hibernate4.1+Atomikos3.9+MySql5.1+Tomcat5/6/7实现JTA事务管理”揭示了一个集成开发环境,用于构建分布式、事务一致性的Java应用程序。这个组合利用了Spring框架的依赖注入和AOP(面向切面...
Spring的PlatformTransactionManager接口是Spring事务管理的核心,它提供了一种抽象的方式来管理事务。当选择使用JTA时,可以使用Spring的JtaTransactionManager,它实现了PlatformTransactionManager,并且与JTA...
综上所述,"spring+druid+AtomikosDataSource"的组合为开发者提供了一套强大的工具,用于实现多数据源切换和分布式事务控制。在实际项目中,通过合理的配置和编码,可以构建出高效、健壮的分布式系统。在`mult-table...
NULL 博文链接:https://lizhao6210-126-com.iteye.com/blog/1958831
本教程将探讨如何利用Spring Boot、Druid、Mybatis以及Atomikos来配置多数据源并实现分布式事务。 首先,Spring Boot是Java生态系统中的一个流行框架,它简化了设置和配置过程,使得开发人员可以快速启动新项目。在...
本案例主要探讨如何利用Spring Boot、Atomikos、JTA(Java Transaction API)、Hibernate以及MyBatis,结合MySQL数据库,实现一个跨数据源的分布式事务解决方案。 首先,Spring Boot是一个基于Spring框架的快速开发...
本项目使用Spring Boot、Atomikos、JTA(Java Transaction API)、Hibernate和MySQL来实现分布式事务处理和多数据源管理,以确保在多个数据库操作之间保持事务的ACID特性。 首先,Spring Boot作为微服务开发的主流...
本文将详细讲解如何利用Spring Boot、Atomikos、JPA(Java Persistence API)以及MySQL来实现JTA(Java Transaction API)分布式事务。 首先,Spring Boot是一个轻量级的框架,它简化了基于Spring的应用程序开发...
使用spring + atomikos+druid配置的分布式事务demo,两种数据源配置方式都可以,使用junit测试没问题,案例中使用的mysql数据库是8.0.11版本,版本不同请自行修改pom.xml和jdbc.properties
本项目“springboot+jta+atomikos”旨在利用Spring Boot框架、Java Transaction API (JTA) 和 Atomikos 这一开源事务管理器来实现分布式事务的统一管理。下面将详细阐述这三个关键组件以及它们如何协同工作。 **...
3. 集成Spring:在Spring配置文件中,指定Atomikos事务管理器,并启用JTA支持。 4. 配置MyBatis:设置SqlSessionFactory,并确保其使用Atomikos提供的数据源。 5. 开启事务支持:在需要执行分布式事务的Service类中...
将基于Spring4.1.7+atomikos+mybaits 实现两阶段的分布式事务处理,通过AOP面向切面实现动态实现数据源的切换 http://www.dczou.com/viemall/407.html
1. Spring配置:包含Spring的事务管理器配置,可能使用`PlatformTransactionManager`接口和Atomikos的实现。 2. Atomikos配置:通常会有一个XML配置文件,定义了事务管理器和用户交易服务。 3. Druid数据源配置:...
在Spring中配置Atomikos,你需要在Spring的配置文件中引入Atomikos的事务管理器,并设置相关的事务属性。同时,你需要在MyBatis的配置中启用JTA事务管理,确保Spring和Atomikos能够协同工作。这样,当你的应用执行跨...
首先,我们需要在Spring配置文件中引入Atomikos的相关依赖。这通常包括配置Atomikos的事务管理器,以及设置全局事务的属性,如超时时间、回滚规则等。在Spring 4中,可以使用`<bean>`标签创建Atomikos的`...
此外,还需要在应用服务器或者Spring等框架的配置文件中配置Atomikos事务管理器,例如在Spring中,你可以使用`AtomikosTransactionManager`作为`PlatformTransactionManager`的实现。 总的来说,Atomikos 3.7 JTA...
从压缩包子文件的文件名称来看,"SpringMVC+Atomikos实现分布式事务管理需要atomikos_3.7_jta包下载",这个文件很可能是包含详细步骤和示例代码的文档,或者是演示如何在SpringMVC项目中配置和使用Atomikos的教程...
3. 配置事务管理器:使用Atomikos的UserTransaction和TransactionManager,配置JTA事务管理器,以处理跨数据源的事务。 4. 注解实体类:使用JPA的@Entity注解定义实体类,并使用@Table指定对应的数据库表。 5. 创建...
本资源"spring+mybatis+atomikos配置文件及相关包(最新版)"提供了整合Spring、MyBatis和Atomikos的配置文件和相关库,以支持在分布式环境下的事务管理。下面将详细解释这三个组件以及它们在分布式事务中的作用。 ...