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

标签: spring hibernate atomikos | 发表时间:2014-07-17 17:56 | 作者:songkaiang
出处:http://www.iteye.com

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

配置文件代码如下:

 

 

<bean id="propertyConfigurer" class="*.*.*.DBConfigurer">
       <property name="order" value="1" />
       <property name="ignoreUnresolvablePlaceholders" value="true" />     
       <property name="location" value="WEB-INF/DBconfig.properties"/> 
    </bean>
    
    <bean id="mysqlDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" 
        init-method="init" destroy-method="close">
        <!-- Set unique name for this DataSource -->  
        <property name="uniqueResourceName">
        	<value>bpm</value>
        </property>
        <!-- Set XADatasource class name-->  
        <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
        <property name="xaProperties">
            <props>
                <prop key="user">${connection.username}</prop>
                <prop key="password">${connection.password}</prop>
                <prop key="url">${connection.url}</prop>
            </props>
        </property>
        <!-- set properties for datasource connection pool -->  
        <property name="poolSize" value="3" />
        <!-- 管理 Connection 被占用的时间 -->
        <!-- 如果不设置这个值,Atomikos使用默认的300秒(即5分钟),那么在处理大批量数据读取的时候,一旦超过5分钟,就会抛出类似 Resultset is close 的错误 -->
        <property name="reapTimeout"><value>20000</value></property>  
    </bean>
    
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="mysqlDataSource" />
		<property name="packagesToScan">
			<list>
				<value>smtcl.mocs.pojos.device</value>
				<value>smtcl.mocs.pojos.authority</value>
				<value>smtcl.mocs.pojos.job</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
<!-- 			    <prop key="hibernate.connection.url">${connection.url}</prop> -->
                <prop key="hibernate.connection.driver_class">${connection.driver}</prop>
<!--                 <prop key="hibernate.connection.username">${connection.username}</prop> -->
<!--                 <prop key="hibernate.connection.password">${connection.password}</prop> -->
                <prop key="hibernate.dialect">${connection.dialect}</prop>
                <prop key="hibernate.show_sql">${connection.show.sql}</prop>
                <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
			</props>
		</property>
	</bean>

	<!-- atomikos事务管理器 -->
    <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" 
        init-method="init" destroy-method="close">
        <property name="forceShutdown">
            <value>true</value>
        </property>
    </bean>

    <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
        <property name="transactionTimeout" value="300" />
    </bean>

    <!-- spring 事务管理器 -->
    <bean id="springTransactionManager"
        class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager" ref="atomikosTransactionManager"/>
        <property name="userTransaction" ref="atomikosUserTransaction" />
        <property name="allowCustomIsolationLevels" value="true"/> 
    </bean>

    <!-- 使用annotation定义事务,对于要加入事物的类,只需对该类加 @Transactional  -->
    <tx:annotation-driven transaction-manager="springTransactionManager" />

<!--     hibernate Dao层模板 -->
<!--     <bean id="transactionManager" -->
<!--         class="org.springframework.orm.hibernate3.HibernateTemplate"> -->
<!--         <property name="sessionFactory" ref="sessionFactory"></property> -->
<!--     </bean> -->
    
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</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数据时,可能会报错,错误信息如下:

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

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

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

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [spring hibernate atomikos] 推荐:

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

- - 企业架构 - ITeye博客
网上有很多的atomikos的分布式事务管理的配置,但是大多数都是同一类型的数据库,并没有跨数据库类型的配置. 使用的数据库是Oracle和mysql. . .

Spring中hibernate配置

- - Oracle - 数据库 - ITeye博客
Hibernate方言(Dialect)的类名 - 可以让Hibernate使用某些特定的数据库平台的特性. 在生成的SQL中,scheml/tablespace的全限定名取值. 自动把创建的SessionFactory以这个名字绑定到JNDI中去.取值. 请使用max_fetch_depth. 对单根联合(一对一,多对一),设置外连接抓取树的最大深度.

在Spring、Hibernate中使用Ehcache缓存

- - BlogJava-首页技术区
前一篇 http://www.blogjava.net/hoojo/archive/2012/07/12/382852.html介绍了Ehcache整合Spring缓存,使用页面、对象缓存;这里将介绍在Hibernate中使用查询缓存、一级缓存、二级缓存,整合Spring在HibernateTemplate中使用查询缓存.

spring+hibernate多数据源的应用

- - CSDN博客推荐文章
我有两个数据库test,和test1,两个库里都有一张表TEST_ONE. applicationContext.xml的配置如下. //数据库test1配置.   //整合两个数据源,指定数据源管理类.    //数据库test.    //数据库test1. //这个类是用来管理数据源的,配置文件中.

Spring/Hibernate应用性能调优

- - ImportNew
对于大多数典型的Spring/Hibernate 企业应用来说,应用程序的性能几乎完全取决于它的持久层的性能. 这篇文章将会对如何确认在“数据库约束”的应用前,使用7种“快速见效”的技巧来帮助我们提升应用性能. 如何确认一个应用受到“数据库约束”. 为了验证一个应用程序是否受到“数据库约束”,首先在一些开发环境中做一些普遍的行为,即使用 VisualVM来监控.

Spring / Hibernate应用性能调优

- - ImportNew
对大部分典型的Spring/Hibernate企业应用来说,应用的性能大部分由持久层的性能决定. 这篇文章会重温一下怎么去确认我们的应用是否是”数据库依赖(data-bound)”( 译者注:即非常依赖数据库,大量时间花在数据库操作上),然后会大概过一下7个常用的提升应用性能的速效方案. 怎么确定应用是否是“数据库依赖”.

Struts2、Spring、Hibernate 高效开发的最佳实践

- senyo - IBM developerWorks 中国 : 文档库
Struts2、Spring、Hibernate(SSH)是最常用的 Java EE Web 组件层的开发技术搭配,网络中和许多 IT 技术书籍中都有它们的开发教程,但是通常的教程都会让很多程序员陷入痛苦的配置与修改配置的过程. 本文利用 SSH 中的技术特性,利用 Java 反射技术,按照规约优于配置的原理,基于 SSH 设定编写了一个通用开发框架,这使得开发者可以专注于业务逻辑的开发,而不用随着业务增加而添加或修改任何配置,并且对于权限控制和日志记录也提供了方便的接口.

spring+hibernate+JTA 分布式事务的例子 .

- - 编程语言 - ITeye博客
对于横跨多个Hibernate SessionFacotry的分布式事务,只需简单地将 JtaTransactionManager 同多个 LocalSessionFactoryBean 的定义结合起来作为事务策略. 你的每一个DAO通过bean属性得到各自的 SessionFactory 引用. 如果所有的底层JDBC数据源都是支持事务的容器,那么只要业务对象使用了 JtaTransactionManager 作为事务策略,它就可以横跨多个DAO和多个session factories来划分事务,而不需要做任何特殊处理.

Spring/Hibernate 应用性能优化的7种方法

- - IT瘾-geek
【编者按】对于大多数典型的 Spring/Hibernate 企业应用而言,其性能表现几乎完全依赖于持久层的性能. 此篇文章中将介绍如何确认应用是否受数据库约束,同时介绍七种常用的提高应用性能的速成法:. 如何确认应用是否受限于数据库. 确认应用是否受限于数据库的第一步,是在开发环境中进行测试,并使用 VisualVM 进行监控.

Best Performance Practices for Hibernate 5 and Spring Boot 2 (Part 1) - DZone Java

- -
Description:If not, then is important to know that attributes can be loaded lazily, as well via Hibernate bytecode instrumentation (another approach is via subentities).