Spring JTA多数据源事务管理详细教程

刚好项目要用到多数据源,在网上查找了很多资料,花了几天的时间对spring、jta 、atomikos、hibernate进行多数据源事务管理的配置。

也可以直接放在tomcat中运行,不过要用ws调用,因为没有做界面,ws入口在controller包里

下面是jta配置文件:

001 <context:annotation-config />
002      
003     <context:component-scan base-package="com.rongli.service,com.rongli.dao,com.rongli.controller" />
004     
005     <tx:annotation-driven transaction-manager="springJTATransactionManager" proxy-target-class="true"/>
006     
007     <import resource="ws.cxf.xml"/>
008   
009     
010     <bean id="propertyConfigurer"
011         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
012         <property name="locations">
013             <list>
014                 <value>classpath:jta.jdbc.propertiesvalue>
015             list>
016         property>
017     bean>
018      
019     
020     <bean id="abstractXADataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
021         init-method="init" destroy-method="close" abstract="true">
022         <property name="xaDataSourceClassName"
023             value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
024         <property name="poolSize" value="10" />
025         <property name="minPoolSize" value="10" />
026         <property name="maxPoolSize" value="30" />
027         
028         <property name="borrowConnectionTimeout" value="60" />
029         
031         <property name="reapTimeout" value="20000" />
032         
033         <property name="maxIdleTime" value="60" />
034          
035         <property name="maintenanceInterval" value="60" />
036          
037         <property name="loginTimeout" value="60" />
038         <property name="testQuery">
039             <value>select 1value>
040         property>
041     bean>
042      
043     
044     <bean id="rlc_cus" parent="abstractXADataSource">
045         <property name="uniqueResourceName" value="mysql/rlc_cus" />
046         <property name="xaProperties">
047             <props>
048                 <prop key="URL">${jdbc.rlc_cus.properties}prop>
049                 <prop key="user">${jdbc.rlc.user}prop>
050                 <prop key="password">${jdbc.rlc.password}prop>
051                 <prop key="pinGlobalTxToPhysicalConnection">trueprop>
052             props>
053         property>
054     bean>
055      
056     
057     <bean id="rlc_sys" parent="abstractXADataSource">
058         <property name="uniqueResourceName" value="mysql/rlc_sys" />
059         <property name="xaProperties">
060             <props>
061                 <prop key="URL">${jdbc.rlc_sys.properties}prop>
062                 <prop key="user">${jdbc.rlc.user}prop>
063                 <prop key="password">${jdbc.rlc.password}prop>
064                 <prop key="pinGlobalTxToPhysicalConnection">trueprop>
065             props>
066         property>
067     bean>
068      
069     
070     <bean id="baseSessionFactory"
071         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
072         abstract="true">
073         <property name="hibernateProperties">
074             <props>
075                 <prop key="hibernate.dialect">${hibernate.dialect}prop>
076                 <prop key="hibernate.show_sql">${hibernate.format_sql}prop>
077                 <prop key="hibernate.format_sql">${hibernate.show_sql}prop>
078                 <prop key="javax.persistence.validation.mode">noneprop>
079             props>
080         property>
081         
082         <property name="packagesToScan" value="com.rongli.bean">property>
083     bean>
084      
085     
086     
087     <bean id="cusSessionFactory" parent="baseSessionFactory">
088         <property name="dataSource" ref="rlc_cus" />
089     bean>
090     
091     <bean id="sysSessionFactory" parent="baseSessionFactory">
092         <property name="dataSource" ref="rlc_sys" />
093     bean>
094  
095     
096     <bean id="atomikosTransactionManager"
097         class="com.atomikos.icatch.jta.UserTransactionManager"
098         init-method="init" destroy-method="close">
099         
100         <property name="forceShutdown">
101             <value>truevalue>
102         property>
103     bean>
104     <bean id="atomikosUserTransaction"
105         class="com.atomikos.icatch.jta.UserTransactionImp">
106         <property name="transactionTimeout">
107             <value>2000value>
108         property>
109     bean>
110  
111      
112     <bean id="springJTATransactionManager"
113         class="org.springframework.transaction.jta.JtaTransactionManager">
114         <property name="transactionManager">
115             <ref bean="atomikosTransactionManager" />
116         property>
117         <property name="userTransaction">
118             <ref bean="atomikosUserTransaction" />
119         property>
120     bean>
121      
122     
123     <bean id="systemServiceImpl"
124         class="com.rongli.service.impl.SystemServiceImpl">
125     bean>

 运行截图:

原2个数据库中都没有数据,图如下:

 

具体代码:

代码运行成功截图:

成功后数据库(乱码请忽略):

 

代码故意抛出异常:

代码运行失败:

失败后2个数据库中没有插入(事务回滚了):

你可能感兴趣的:(Spring)