luo900126的gravatar头像
luo900126 2016-03-18 11:00:53

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

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

没有花时间弄maven,lib的地址:https://pan.baidu.com/s/1skdIC3N

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

下面是jta配置文件:

<context:annotation-config />
  	<!-- 使用注解的包路径 -->  
    <context:component-scan base-package="com.rongli.service,com.rongli.dao,com.rongli.controller" />
    <!-- 支持  @Transactional 标记   -->
    <tx:annotation-driven transaction-manager="springJTATransactionManager" proxy-target-class="true"/> 
    <!-- 导入cxf配置文件 -->
    <import resource="ws.cxf.xml"/>
 
	<!-- 加载properties配置文件 -->
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:jta.jdbc.properties</value>
			</list>
		</property>
	</bean>
	
	<!--公有数据库连接池  -->
	<bean id="abstractXADataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
		init-method="init" destroy-method="close" abstract="true">
		<property name="xaDataSourceClassName"
			value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
		<property name="poolSize" value="10" />
		<property name="minPoolSize" value="10" />
		<property name="maxPoolSize" value="30" />
		<!--获取连接失败重新获等待最大时间,在这个时间内如果有可用连接,将返回-->
		<property name="borrowConnectionTimeout" value="60" />
		<!--最大获取数据时间,如果不设置这个值,Atomikos使用默认的5分钟,
		那么在处理大批量数据读取的时候,一旦超过5分钟,就会抛出类似 Resultset is close 的错误.-->
		<property name="reapTimeout" value="20000" />
		<!-- 最大空闲时间 -->
		<property name="maxIdleTime" value="60" />
		 <!--连接回收时间-->
		<property name="maintenanceInterval" value="60" />
		 <!--java数据库连接池,最大可等待获取datasouce的时间-->
		<property name="loginTimeout" value="60" />
		<property name="testQuery">
			<value>select 1</value>
		</property>
	</bean>
	
	<!-- 客户数据库 -->
	<bean id="rlc_cus" parent="abstractXADataSource">
		<property name="uniqueResourceName" value="mysql/rlc_cus" />
		<property name="xaProperties">
			<props>
				<prop key="URL">${jdbc.rlc_cus.properties}</prop>
				<prop key="user">${jdbc.rlc.user}</prop>
				<prop key="password">${jdbc.rlc.password}</prop>
				<prop key="pinGlobalTxToPhysicalConnection">true</prop>
			</props>
		</property>
	</bean>
	
	<!-- 系统数据库 -->
	<bean id="rlc_sys" parent="abstractXADataSource">
		<property name="uniqueResourceName" value="mysql/rlc_sys" />
		<property name="xaProperties">
			<props>
				<prop key="URL">${jdbc.rlc_sys.properties}</prop>
				<prop key="user">${jdbc.rlc.user}</prop>
				<prop key="password">${jdbc.rlc.password}</prop>
				<prop key="pinGlobalTxToPhysicalConnection">true</prop>
			</props>
		</property>
	</bean>
	
	<!-- 公有SessionFactory配置 -->
	<bean id="baseSessionFactory" 
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
		abstract="true">
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="hibernate.show_sql">${hibernate.format_sql}</prop>
				<prop key="hibernate.format_sql">${hibernate.show_sql}</prop>
				<prop key="javax.persistence.validation.mode">none</prop>
			</props>
		</property>
		<!-- 自动扫描注解方式配置的hibernate类文件 -->
		<property name="packagesToScan" value="com.rongli.bean"></property>
	</bean>
	
	<!-- sessionFactory配置-->
	<!-- customer sessionFactory -->
	<bean id="cusSessionFactory" parent="baseSessionFactory">
		<property name="dataSource" ref="rlc_cus" />
	</bean>
	<!-- system sessionFactory -->
	<bean id="sysSessionFactory" parent="baseSessionFactory">
		<property name="dataSource" ref="rlc_sys" />
	</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>2000</value>
		</property>
	</bean>

	 <!-- spring 事务管理器 -->
	<bean id="springJTATransactionManager"
		class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="transactionManager">
			<ref bean="atomikosTransactionManager" />
		</property>
		<property name="userTransaction">
			<ref bean="atomikosUserTransaction" />
		</property>
	</bean>
	
	<!-- 用于测试,发布到服务器上时删除 -->
	<bean id="systemServiceImpl"
		class="com.rongli.service.impl.SystemServiceImpl">
	</bean>

 运行截图:

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

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

 

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

具体代码:

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

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

代码运行成功截图:

spring JTA多数据源事务管理详细教程成功后数据库(乱码请忽略):

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

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

 

代码故意抛出异常:

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

代码运行失败:

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

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

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


打赏

文件名:jtatest.rar,文件大小:86.043K 下载
  • /
      • /jtatest
        • /jtatest/.classpath
        • /jtatest/.project
          • /jtatest/.settings
            • /jtatest/.settings/.jsdtscope
            • /jtatest/.settings/org.eclipse.core.resources.prefs
            • /jtatest/.settings/org.eclipse.jdt.core.prefs
            • /jtatest/.settings/org.eclipse.wst.common.component
            • /jtatest/.settings/org.eclipse.wst.common.project.facet.core.xml
            • /jtatest/.settings/org.eclipse.wst.jsdt.ui.superType.container
            • /jtatest/.settings/org.eclipse.wst.jsdt.ui.superType.name
          • /jtatest/resources
            • /jtatest/resources/jta.jdbc.properties
最代码最近下载分享源代码列表最近下载
123456ym  LV9 2022年4月27日
qqaazz1  LV5 2018年11月28日
cdghds  LV1 2018年4月11日
KevinKevin  LV2 2018年3月24日
CLATZJ  LV19 2018年3月15日
scpcyzxb  LV16 2018年1月14日
3013886712  LV7 2017年11月16日
yunlielai  LV13 2017年11月2日
l06066hb  LV2 2017年9月20日
七味都市  LV3 2017年8月14日
最代码最近浏览分享源代码列表最近浏览
xp95323  LV14 2022年9月21日
123456ym  LV9 2022年4月27日
xb1406112453  LV5 2021年5月26日
sizeking  LV8 2021年4月12日
939867966  LV1 2021年2月25日
ld950929 2020年12月23日
暂无贡献等级
g1121345342  LV9 2020年12月16日
Coincidance  LV8 2020年12月3日
is_gary  LV15 2020年8月24日
梓丶叶  LV1 2020年6月28日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友