`

使用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)

相关推荐

    JTA事务源码示例

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

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

    主要介绍了springboot jta atomikos实现分布式事物管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java开源包3

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包4

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    Java资源包01

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包8

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包1

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包11

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包2

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包6

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包5

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包10

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包7

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包9

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    java开源包101

    使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache ...

    JAVA_API1.6文档(中文)

    javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...

    超级有影响力霸气的Java面试题大全文档

    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 11、EJB是基于哪些技术实现的?并说出...

    java 面试题 总结

    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出Session...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

Global site tag (gtag.js) - Google Analytics