当前位置:   article > 正文

spring+hibernate+atomikos 分布式事务管理

atomikos+hibernate+lazy

网上有很多的atomikos的分布式事务管理的配置,但是大多数都是同一类型的数据库,并没有跨数据库类型的配置。使用的数据库是Oracle和mysql。

配置文件代码如下:

 

 

  1. <bean id="propertyConfigurer" class="*.*.*.DBConfigurer">
  2. <property name="order" value="1" />
  3. <property name="ignoreUnresolvablePlaceholders" value="true" />
  4. <property name="location" value="WEB-INF/DBconfig.properties"/>
  5. </bean>
  6. <bean id="mysqlDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
  7. init-method="init" destroy-method="close">
  8. <!-- Set unique name for this DataSource -->
  9. <property name="uniqueResourceName">
  10. <value>bpm</value>
  11. </property>
  12. <!-- Set XADatasource class name-->
  13. <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
  14. <property name="xaProperties">
  15. <props>
  16. <prop key="user">${connection.username}</prop>
  17. <prop key="password">${connection.password}</prop>
  18. <prop key="url">${connection.url}</prop>
  19. </props>
  20. </property>
  21. <!-- set properties for datasource connection pool -->
  22. <property name="poolSize" value="3" />
  23. <!-- 管理 Connection 被占用的时间 -->
  24. <!-- 如果不设置这个值,Atomikos使用默认的300秒(即5分钟),那么在处理大批量数据读取的时候,一旦超过5分钟,就会抛出类似 Resultset is close 的错误 -->
  25. <property name="reapTimeout"><value>20000</value></property>
  26. </bean>
  27. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  28. <property name="dataSource" ref="mysqlDataSource" />
  29. <property name="packagesToScan">
  30. <list>
  31. <value>smtcl.mocs.pojos.device</value>
  32. <value>smtcl.mocs.pojos.authority</value>
  33. <value>smtcl.mocs.pojos.job</value>
  34. </list>
  35. </property>
  36. <property name="hibernateProperties">
  37. <props>
  38. <!-- <prop key="hibernate.connection.url">${connection.url}</prop> -->
  39. <prop key="hibernate.connection.driver_class">${connection.driver}</prop>
  40. <!-- <prop key="hibernate.connection.username">${connection.username}</prop> -->
  41. <!-- <prop key="hibernate.connection.password">${connection.password}</prop> -->
  42. <prop key="hibernate.dialect">${connection.dialect}</prop>
  43. <prop key="hibernate.show_sql">${connection.show.sql}</prop>
  44. <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
  45. </props>
  46. </property>
  47. </bean>
  48. <!-- atomikos事务管理器 -->
  49. <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
  50. init-method="init" destroy-method="close">
  51. <property name="forceShutdown">
  52. <value>true</value>
  53. </property>
  54. </bean>
  55. <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
  56. <property name="transactionTimeout" value="300" />
  57. </bean>
  58. <!-- spring 事务管理器 -->
  59. <bean id="springTransactionManager"
  60. class="org.springframework.transaction.jta.JtaTransactionManager">
  61. <property name="transactionManager" ref="atomikosTransactionManager"/>
  62. <property name="userTransaction" ref="atomikosUserTransaction" />
  63. <property name="allowCustomIsolationLevels" value="true"/>
  64. </bean>
  65. <!-- 使用annotation定义事务,对于要加入事物的类,只需对该类加 @Transactional -->
  66. <tx:annotation-driven transaction-manager="springTransactionManager" />
  67. <!-- hibernate Dao层模板 -->
  68. <!-- <bean id="transactionManager" -->
  69. <!-- class="org.springframework.orm.hibernate3.HibernateTemplate"> -->
  70. <!-- <property name="sessionFactory" ref="sessionFactory"></property> -->
  71. <!-- </bean> -->
  72. <bean id="transactionManager"
  73. class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  74. <property name="sessionFactory" ref="sessionFactory" />
  75. </bean>

 

<bean id="erpPropertyConfigurer" class="*。*。*.ERPDBConfigurer">
     	<property name="order" value="2" />
     	<property name="ignoreUnresolvablePlaceholders" value="true" />     
    	<property name="location" value="WEB-INF/ERPDBconfig.properties"/> 
    </bean>
    
    <bean id="oracleDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean">
		<property name="uniqueResourceName">
			<value>chh</value>
		</property>
		<property name="xaDataSourceClassName" value="oracle.jdbc.xa.client.OracleXADataSource"/>
		<property name="xaProperties">
            <props>
                <prop key="user">${connection.username}</prop>
                <prop key="password">${connection.password}</prop>
                <prop key="URL">${connection.url}</prop>
            </props>
        </property>
		<property name="poolSize">
			<value>1</value>
		</property>
		<property name="borrowConnectionTimeout">
			<value>60</value>
		</property>
	</bean>

	<bean id="erpSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="oracleDataSource" />
		<property name="packagesToScan">
			<list>
				<value>smtcl.mocs.pojos.erp</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
<!-- 			    <prop key="hibernate.connection.url">${erp.connection.url}</prop> -->
                <prop key="hibernate.connection.driver_class">${erp.connection.driver}</prop>
<!--                 <prop key="hibernate.connection.username">${erp.connection.username}</prop> -->
<!--                 <prop key="hibernate.connection.password">${erp.connection.password}</prop> -->
                <prop key="hibernate.dialect">${erp.connection.dialect}</prop>
                <prop key="hibernate.show_sql">${erp.connection.show.sql}</prop>
                <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
			</props>
		</property>
	</bean>

<!-- 	 <bean id="erpTransactionManager" -->
<!--         class="org.springframework.orm.hibernate3.HibernateTemplate"> -->
<!--         <property name="sessionFactory" ref="erpSessionFactory"></property> -->
<!--     </bean> -->

	<bean id="erpTransactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="erpSessionFactory" />
	</bean>

 分布式事务在连接Oracle数据时,可能会报错,错误信息如下:

  1. javax.transaction.xa.XAException
  2. at oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java:526)
  3. at com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.recover(WSRdbXaResourceImpl.java:1038)
  4. at com.ibm.ws.Transaction.JTA.XARminst.recover(XARminst.java:138)
  5. at com.ibm.ws.Transaction.JTA.XARecoveryData.recover(XARecoveryData.java:687)
  6. at com.ibm.ws.Transaction.JTA.PartnerLogTable.recover(PartnerLogTable.java:524)
  7. at com.ibm.ws.Transaction.JTA.RecoveryManager.resync(RecoveryManager.java:1859)
  8. at com.ibm.ws.Transaction.JTA.RecoveryManager.run(RecoveryManager.java:2580)
  9. at java.lang.Thread.run(Thread.java:810)

 可以在Oracle数据库中执行sql语句:

  1. 1.grant select on sys.dba_pending_transactions to username;
  2. 2.grant select on sys.pending_trans$ to username;
  3. 3.grant select on sys.dba_2pc_pending to username;
  4. 4.grant execute on sys.dbms_system to username;

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/346873?site
推荐阅读
相关标签
  

闽ICP备14008679号