0 0

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个答案 按时间排序 按投票排序

0 0

检查你的jta.properties文件的,每一行的末尾时候有多余的空格,删掉。
重点是这一行com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
末尾不能有空格

2016年3月28日 20:07
0 0

我这篇文章有讲 Atomikos
http://jinnianshilongnian.iteye.com/blog/1439900

MySql存储引擎是InnoDB??  MyISAM不支持事务

2012年9月06日 12:15

相关推荐

    Spring+MyBatis+Atomikos实现JTA分布式事务

    2. `applicationContext.xml`或对应的Java配置类:配置Spring的事务管理器和数据源,以及Atomikos相关的bean。 3. MyBatis的配置:定义SqlSessionFactory,并与Spring集成。 4. 示例代码:展示了如何在方法上使用`@...

    Spring3.1+Hibernate4.1+Atomikos3.9+MySql5.1+Tomcat5/6/7实现JTA事务管理

    标题中的“Spring3.1+Hibernate4.1+Atomikos3.9+MySql5.1+Tomcat5/6/7实现JTA事务管理”揭示了一个集成开发环境,用于构建分布式、事务一致性的Java应用程序。这个组合利用了Spring框架的依赖注入和AOP(面向切面...

    spring + JTA + atomikos 实现分布式事务

    Spring的PlatformTransactionManager接口是Spring事务管理的核心,它提供了一种抽象的方式来管理事务。当选择使用JTA时,可以使用Spring的JtaTransactionManager,它实现了PlatformTransactionManager,并且与JTA...

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    综上所述,"spring+druid+AtomikosDataSource"的组合为开发者提供了一套强大的工具,用于实现多数据源切换和分布式事务控制。在实际项目中,通过合理的配置和编码,可以构建出高效、健壮的分布式系统。在`mult-table...

    spring+mybatis+Atomikos JTA事务配置说明

    NULL 博文链接:https://lizhao6210-126-com.iteye.com/blog/1958831

    Spring Boot + Druid + Mybatis + Atomikos 配置多数据源 并支持分布式事务

    本教程将探讨如何利用Spring Boot、Druid、Mybatis以及Atomikos来配置多数据源并实现分布式事务。 首先,Spring Boot是Java生态系统中的一个流行框架,它简化了设置和配置过程,使得开发人员可以快速启动新项目。在...

    Spring boot+Atomikos+JTA+Hibernate+mybatis+MySQL实现分布式事务+多数据源

    本案例主要探讨如何利用Spring Boot、Atomikos、JTA(Java Transaction API)、Hibernate以及MyBatis,结合MySQL数据库,实现一个跨数据源的分布式事务解决方案。 首先,Spring Boot是一个基于Spring框架的快速开发...

    Spring boot+Atomikos+JTA+Hibernate+MySQL实现分布式事务+多数据源(可运行)

    本项目使用Spring Boot、Atomikos、JTA(Java Transaction API)、Hibernate和MySQL来实现分布式事务处理和多数据源管理,以确保在多个数据库操作之间保持事务的ACID特性。 首先,Spring Boot作为微服务开发的主流...

    Springboot+Atomikos+Jpa+Mysql实现JTA分布式事务

    本文将详细讲解如何利用Spring Boot、Atomikos、JPA(Java Persistence API)以及MySQL来实现JTA(Java Transaction API)分布式事务。 首先,Spring Boot是一个轻量级的框架,它简化了基于Spring的应用程序开发...

    spring+atomikos+druid分布式事务

    使用spring + atomikos+druid配置的分布式事务demo,两种数据源配置方式都可以,使用junit测试没问题,案例中使用的mysql数据库是8.0.11版本,版本不同请自行修改pom.xml和jdbc.properties

    springboot+jta+atomikos

    本项目“springboot+jta+atomikos”旨在利用Spring Boot框架、Java Transaction API (JTA) 和 Atomikos 这一开源事务管理器来实现分布式事务的统一管理。下面将详细阐述这三个关键组件以及它们如何协同工作。 **...

    基于Spring4.1.7+atomikos+mybaits 实现两阶段的分布式事务处理

    3. 集成Spring:在Spring配置文件中,指定Atomikos事务管理器,并启用JTA支持。 4. 配置MyBatis:设置SqlSessionFactory,并确保其使用Atomikos提供的数据源。 5. 开启事务支持:在需要执行分布式事务的Service类中...

    Spring4.1.7+atomikos+mybaits 实现两阶段的分布式事务处理

    将基于Spring4.1.7+atomikos+mybaits 实现两阶段的分布式事务处理,通过AOP面向切面实现动态实现数据源的切换 http://www.dczou.com/viemall/407.html

    spring+atomikos+druid分布式事务Demo

    1. Spring配置:包含Spring的事务管理器配置,可能使用`PlatformTransactionManager`接口和Atomikos的实现。 2. Atomikos配置:通常会有一个XML配置文件,定义了事务管理器和用户交易服务。 3. Druid数据源配置:...

    spring+mybatis+atomikos配置文件及相关包

    在Spring中配置Atomikos,你需要在Spring的配置文件中引入Atomikos的事务管理器,并设置相关的事务属性。同时,你需要在MyBatis的配置中启用JTA事务管理,确保Spring和Atomikos能够协同工作。这样,当你的应用执行跨...

    spring4+atomikos实现分布式事务

    首先,我们需要在Spring配置文件中引入Atomikos的相关依赖。这通常包括配置Atomikos的事务管理器,以及设置全局事务的属性,如超时时间、回滚规则等。在Spring 4中,可以使用`&lt;bean&gt;`标签创建Atomikos的`...

    atomikos_3.7_jta项目整合jar包

    此外,还需要在应用服务器或者Spring等框架的配置文件中配置Atomikos事务管理器,例如在Spring中,你可以使用`AtomikosTransactionManager`作为`PlatformTransactionManager`的实现。 总的来说,Atomikos 3.7 JTA...

    atomikos_3.7_jta JAR包下载

    从压缩包子文件的文件名称来看,"SpringMVC+Atomikos实现分布式事务管理需要atomikos_3.7_jta包下载",这个文件很可能是包含详细步骤和示例代码的文档,或者是演示如何在SpringMVC项目中配置和使用Atomikos的教程...

    spring+jpa+atomikos多数据源

    3. 配置事务管理器:使用Atomikos的UserTransaction和TransactionManager,配置JTA事务管理器,以处理跨数据源的事务。 4. 注解实体类:使用JPA的@Entity注解定义实体类,并使用@Table指定对应的数据库表。 5. 创建...

    spring+mybatis+atomikos配置文件及相关包(最新版)

    本资源"spring+mybatis+atomikos配置文件及相关包(最新版)"提供了整合Spring、MyBatis和Atomikos的配置文件和相关库,以支持在分布式环境下的事务管理。下面将详细解释这三个组件以及它们在分布式事务中的作用。 ...

Global site tag (gtag.js) - Google Analytics