`

使用JTA实现跨库事务

阅读更多
本文是基于atomikos实现的JTA跨库事务
示例中的数据访问层为Hibernate,可替换为喜欢的任意的方式。
具体使用比较简单,只是需要在配置上做一些修改
具体测试源码见附件,其中核心配置如下:
    <context:component-scan base-package="com.ajita.*" />
	<tx:annotation-driven />
	<tx:jta-transaction-manager />

	<bean id="dataSourceA" class="com.atomikos.jdbc.AtomikosDataSourceBean"
		init-method="init" destroy-method="close">
		<property name="uniqueResourceName">
			<value>DataSourceA</value>
		</property>
		<property name="xaDataSourceClassName">
			<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
		</property>
		<property name="xaProperties">
			<props>
				<prop key="databaseName">test</prop>
				<prop key="serverName">127.0.0.1</prop>
				<prop key="port">3306</prop>
				<prop key="user">root</prop>
				<prop key="password">123456</prop>
				<prop key="url">jdbc:mysql://127.0.0.1:3306/test</prop>
			</props>
		</property>
		<property name="minPoolSize">
			<value>1</value>
		</property>
	</bean>

	<bean id="dataSourceB" class="com.atomikos.jdbc.AtomikosDataSourceBean"
		init-method="init" destroy-method="close">
		<property name="uniqueResourceName">
			<value>DataSourceB</value>
		</property>
		<property name="xaDataSourceClassName">
			<value>net.sourceforge.jtds.jdbcx.JtdsDataSource</value>
		</property>
		<property name="xaProperties">
			<props>
				<prop key="databaseName">SimpleDB</prop>
				<prop key="serverName">127.0.0.1</prop>
				<prop key="portNumber">1434</prop>
				<prop key="user">sa</prop>
				<prop key="password">123456</prop>
			</props>
		</property>
		<property name="minPoolSize">
			<value>1</value>
		</property>
	</bean>

	<bean id="entityManagerFactoryA"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceXmlLocation">
			<value>classpath*:persistence.xml</value>
		</property>
		<property name="persistenceUnitName" value="PersistenceUnitA" />
		<property name="dataSource" ref="dataSourceA" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="showSql" value="true" />
				<property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
			</bean>
		</property>
	</bean>

	<bean id="entityManagerFactoryB"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceXmlLocation">
			<value>classpath*:persistence.xml</value>
		</property>
		<property name="persistenceUnitName" value="PersistenceUnitB" />
		<property name="dataSource" ref="dataSourceB" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="showSql" value="true" />
				<property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" />
			</bean>
		</property>
	</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>


有不清楚的,欢迎留言交流~
分享到:
评论
4 楼 johnny_56 2014-06-20  
嗯。问题已解决,谢谢,是连接的问题,但是不是配置文件问题,而是数据库问题。
3 楼 Ajita 2014-06-19  
johnny_56 写道
johnny_56 写道
你好,请问,我的报这个是什么原因呢。
用的是jtds1.2.7
Caused by: com.atomikos.beans.PropertyException: no writeable property 'URL' in class 'net.sourceforge.jtds.jdbcx.JtdsDataSource'
at com.atomikos.beans.PropertyUtils.getSetter(PropertyUtils.java:261)
at com.atomikos.beans.PropertyUtils.setDirectProperty(PropertyUtils.java:175)
at com.atomikos.beans.PropertyUtils.setProperty(PropertyUtils.java:85)
at com.atomikos.beans.PropertyUtils.setProperties(PropertyUtils.java:161)
at com.atomikos.jdbc.AtomikosDataSourceBean.doInit(AtomikosDataSourceBean.java:167)
at com.atomikos.jdbc.AbstractDataSourceBean.init(AbstractDataSourceBean.java:239)



这个问题解决了。是之前换驱动了。数据库是sqlserver2000,一开始用的是微软的驱动,后来因为不支持XA,所以换了jtds,然后参数设置不一样。
换成这样。
<bean id="dataSourceSqlServer" class="com.atomikos.jdbc.AtomikosDataSourceBean" 
        init-method="init" destroy-method="close"> 
       <property name="uniqueResourceName" value="sqlserver_ds" /> 
       <property name="xaDataSourceClassName">
<value>net.sourceforge.jtds.jdbcx.JtdsDataSource</value>
</property>
        <!--  <property name="xaDataSourceClassName"  value="${sqlServer.driverXA}" />-->
        <property name="xaProperties">
        <props>
<prop key="databaseName">HallQueueDbWasu</prop>
<prop key="serverName">127.0.0.1</prop>
<prop key="portNumber">1433</prop>
<prop key="user">sa</prop>
<prop key="password">sa</prop>
</props>
        </property>
        <property name="minPoolSize">
<value>1</value>
</property>
</bean> 。但是又抱另一个错误了。。。。

Caused by: com.atomikos.jdbc.AtomikosSQLException: Cannot initialize AtomikosDataSourceBean
at com.atomikos.jdbc.AtomikosSQLException.throwAtomikosSQLException(AtomikosSQLException.java:19)
at com.atomikos.jdbc.AbstractDataSourceBean.init(AbstractDataSourceBean.java:249)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1544)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
... 46 more
Caused by: com.atomikos.icatch.SysException: XAConnectionFactory: failed to create pooled connection
at com.atomikos.jdbc.AtomikosXAConnectionFactory.createPooledConnection(AtomikosXAConnectionFactory.java:42)
at com.atomikos.datasource.pool.ConnectionPool.init(ConnectionPool.java:45)
at com.atomikos.datasource.pool.ConnectionPool.<init>(ConnectionPool.java:33)
at com.atomikos.jdbc.AbstractDataSourceBean.init(AbstractDataSourceBean.java:240)
... 53 more
2014-6-19 16:25:38 org.apache.catalina.core.StandardContext start

主要是创建连接池失败了,还是配置参数的问题。
2 楼 johnny_56 2014-06-19  
johnny_56 写道
你好,请问,我的报这个是什么原因呢。
用的是jtds1.2.7
Caused by: com.atomikos.beans.PropertyException: no writeable property 'URL' in class 'net.sourceforge.jtds.jdbcx.JtdsDataSource'
at com.atomikos.beans.PropertyUtils.getSetter(PropertyUtils.java:261)
at com.atomikos.beans.PropertyUtils.setDirectProperty(PropertyUtils.java:175)
at com.atomikos.beans.PropertyUtils.setProperty(PropertyUtils.java:85)
at com.atomikos.beans.PropertyUtils.setProperties(PropertyUtils.java:161)
at com.atomikos.jdbc.AtomikosDataSourceBean.doInit(AtomikosDataSourceBean.java:167)
at com.atomikos.jdbc.AbstractDataSourceBean.init(AbstractDataSourceBean.java:239)



这个问题解决了。是之前换驱动了。数据库是sqlserver2000,一开始用的是微软的驱动,后来因为不支持XA,所以换了jtds,然后参数设置不一样。
换成这样。
<bean id="dataSourceSqlServer" class="com.atomikos.jdbc.AtomikosDataSourceBean" 
        init-method="init" destroy-method="close"> 
       <property name="uniqueResourceName" value="sqlserver_ds" /> 
       <property name="xaDataSourceClassName">
<value>net.sourceforge.jtds.jdbcx.JtdsDataSource</value>
</property>
        <!--  <property name="xaDataSourceClassName"  value="${sqlServer.driverXA}" />-->
        <property name="xaProperties">
        <props>
<prop key="databaseName">HallQueueDbWasu</prop>
<prop key="serverName">127.0.0.1</prop>
<prop key="portNumber">1433</prop>
<prop key="user">sa</prop>
<prop key="password">sa</prop>
</props>
        </property>
        <property name="minPoolSize">
<value>1</value>
</property>
</bean> 。但是又抱另一个错误了。。。。

Caused by: com.atomikos.jdbc.AtomikosSQLException: Cannot initialize AtomikosDataSourceBean
at com.atomikos.jdbc.AtomikosSQLException.throwAtomikosSQLException(AtomikosSQLException.java:19)
at com.atomikos.jdbc.AbstractDataSourceBean.init(AbstractDataSourceBean.java:249)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1544)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
... 46 more
Caused by: com.atomikos.icatch.SysException: XAConnectionFactory: failed to create pooled connection
at com.atomikos.jdbc.AtomikosXAConnectionFactory.createPooledConnection(AtomikosXAConnectionFactory.java:42)
at com.atomikos.datasource.pool.ConnectionPool.init(ConnectionPool.java:45)
at com.atomikos.datasource.pool.ConnectionPool.<init>(ConnectionPool.java:33)
at com.atomikos.jdbc.AbstractDataSourceBean.init(AbstractDataSourceBean.java:240)
... 53 more
2014-6-19 16:25:38 org.apache.catalina.core.StandardContext start
1 楼 johnny_56 2014-06-19  
你好,请问,我的报这个是什么原因呢。
用的是jtds1.2.7
Caused by: com.atomikos.beans.PropertyException: no writeable property 'URL' in class 'net.sourceforge.jtds.jdbcx.JtdsDataSource'
at com.atomikos.beans.PropertyUtils.getSetter(PropertyUtils.java:261)
at com.atomikos.beans.PropertyUtils.setDirectProperty(PropertyUtils.java:175)
at com.atomikos.beans.PropertyUtils.setProperty(PropertyUtils.java:85)
at com.atomikos.beans.PropertyUtils.setProperties(PropertyUtils.java:161)
at com.atomikos.jdbc.AtomikosDataSourceBean.doInit(AtomikosDataSourceBean.java:167)
at com.atomikos.jdbc.AbstractDataSourceBean.init(AbstractDataSourceBean.java:239)

相关推荐

    Springboot 动态多数据源 jta分布式事务

    1. Atomikos:这是一个开源的JTA实现,提供了一种在Spring Boot中实现分布式事务的方式。 2. Bitronix:另一种JTA实现,也可以与Spring Boot集成,处理分布式事务。 要启用JTA事务管理,你需要: 1. 添加Atomikos...

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

    Atomikos通过实现JTA规范,允许应用程序在不同的数据源之间进行跨系统事务处理。 JPA是Java平台上的标准ORM(Object-Relational Mapping)框架,用于管理和持久化Java对象到关系数据库。它提供了一种抽象层,使得...

    Spring Boot+Druid+Mybatis实现JTA分布式事务

    本教程将详细讲解如何使用Spring Boot、Druid和Mybatis来实现JTA(Java Transaction API)分布式事务。这是一项高级技术,它允许在多数据库环境或者微服务架构中进行一致性的数据操作。 首先,让我们了解什么是JTA...

    跨数据库的事务管理配置jta

    通过上述配置,我们可以看到如何在一个Spring应用程序中配置多个数据源,并使用JTA进行跨数据源的事务管理。这种配置方式非常灵活,可以适应复杂的企业级应用需求。在实际应用中,根据具体的应用场景和性能需求,还...

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

    本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java Open Transaction Manager (JOTM) 来实现这样的分布式事务管理。 首先,我们来了解一下JTA。JTA是Java平台的标准事务API,它允许应用程序...

    Spring配置JTA事务管理

    1. 引入依赖:确保你的项目包含了JTA相关的库,例如Atomikos或Bitronix,它们是开源的JTA实现。在Maven项目中,你需要在pom.xml中添加对应的依赖。 2. 配置JTA Manager:在Spring的配置文件(如`applicationContext...

    在Spring中使用JTA事务管理

    在MySQL中,你需要创建至少两个数据库来演示JTA事务的跨库操作。确保这两个数据库的连接信息已经配置好,以便Spring可以访问它们。 #### 1.4. 配置Spring 在Spring的配置文件(如`applicationContext.xml`)中,你...

    Jboss4.2.2+Spring2.5.6+hibernate+JTA事务的实现

    在Spring框架中,可以通过配置使Spring的声明式事务管理支持JTA,实现跨多个数据源的事务管理。 集成这四个技术的步骤通常包括: 1. **配置JBoss**:首先,你需要将Spring和Hibernate的相关库添加到JBoss的类路径...

    分布式事务操作之Spring+JTA+mybatis源码

    - **Atomikos、Bitronix等JTA实现**:这些第三方库实现了JTA规范,可以用来管理分布式事务。 6. **配置Spring JTA事务**:在Spring的配置文件中,你需要配置 `UserTransaction` 和 `TransactionManager`,并启用...

    java实现JTA简单例子

    Java JTA,全称为Java Transaction API,是Java平台上的事务处理标准,用于管理跨系统或跨资源的事务。它提供了一种统一的方式来控制应用程序中的事务,使得开发者可以在不同的数据库、消息队列等资源之间进行协调,...

    JTA事务源码示例

    如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,欢迎下载传播。有问题请在评价中...

    多数据源事务jta测试

    `JTA(Java Transaction API)`是Java平台提供的一种标准,用于处理跨多个数据存储的事务管理。这篇博客"多数据源事务jta测试"可能探讨了如何在Java环境中利用JTA来实现对不同数据库的事务一致性。 JTA允许应用程序...

    第二部分spring+hibernate+jta 分布式事务Demo

    Atomikos是一个开源的JTA实现,它提供了一套完整的事务管理解决方案,包括事务协调器和服务,以支持分布式事务。在项目中引入`transactions-jta.jar`、`transactions.jar`、`atomikos-util.jar`等Atomikos相关的库,...

    Atomikos jta事务框架改写历程

    为了解决这个情况,我们需要对JtaTransactionManager进行扩展,添加一个`switchDb`属性来区分jtaTx事务和singleTx事务,并在执行跨库操作时动态切换数据库连接。 参考蔡志国和户启龙的思路,可以改写`...

    springboot jta atomikos实现分布式事物管理

    使用 SpringBoot JTA Atomikos 实现分布式事务管理可以解决多个数据库之间的事务问题。例如,我们可以使用 @Transactional 注解来标记需要事务管理的方法: ```java @Service public class MyService { @...

    集成jta-atomikos 实现分布式事务.zip

    // 执行一些跨库操作 // 如果在这过程中出现异常,Atomikos会回滚所有涉及的事务 } } ``` 通过以上步骤,我们成功地在SpringBoot应用中集成了Atomikos,实现了分布式事务管理。这种方式允许我们在多数据库或多...

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

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

Global site tag (gtag.js) - Google Analytics