spring多数据源的配置(分布式事务管理)
不依赖于应用服务器(这里使用tomcat服务器)的开源jta分布式事务管理的实现有两种方式,分别为:Jotm、atomikos,下面着重讲解用这两种方式如何配置多数据源并支持分布式事务管理
1、Jotm(Java Open Transaction Manager)
1.1、jotm:即基于java开放事务管理器,实现jta规范,能够运行在非应用服务器环境中,web容器或独立java se环境,官网地址:http://jotm.objectweb.org/
1.2、依赖的jar文件
jotm-client.jar
jotm-core.jar
jotm-datasource.jar
jotm-jms.jar
jotm-standalone.jar
ow2-jta-1.1-spec.jar
xapool.jar
1.3、首先配置支持Jotm工厂Bean
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean">
<property name="defaultTimeout" value="500000"></property>
</bean>
1.4、配置分布式数据源
<pre name="code" class="html"><bean id="dataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource">
<bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager" ref="jotm"/>
<property name="driverName" value="${database.driverClass}"/>
<property name="url" value="${database.jdbcUrl}"/>
</bean>
</property>
<property name="user" value="${database.user}"></property>
<property name="password" value="${database.password}"></property>
</bean>
<bean id="dataSource2" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource">
<bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager" ref="jotm"/>
<property name="driverName" value="${database2.driverClass}"/>
<property name="url" value="${database2.jdbcUrl}"/>
</bean>
</property>
<property name="user" value="${database2.user}"></property>
<property name="password" value="${database2.password}"></property>
</bean>
1.5、配置数据管理
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="jotm" />
</bean>
2.1、依赖的jar文件
transactions-jdbc
transactions-jta
transactions-api
transactions
atomikos-utils
transactions-jta
transactions-api
transactions
atomikos-utils
2.2、配置多数据源
下面以informix、Oracle数据库为例
<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="dataSource"/>
<property name="xaDataSourceClassName" value="com.informix.jdbcx.IfxXADataSource"/>
<property name="xaProperties">
<props>
<prop key="ifxIFXHOST">${database.ifxhost}</prop>
<prop key="serverName">${database.serverName}</prop>
<prop key="portNumber">${database.portNumber}</prop>
<prop key="databaseName">${database.databaseName}</prop>
<prop key="user">${database.user} </prop>
<prop key="password">${database.password} </prop>
</props>
</property>
<property name="maxPoolSize"><value>30</value> </property>
</bean>
<bean id="dataSource2" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="malldataSource"/>
<property name="xaDataSourceClassName" value="oracle.jdbc.xa.client.OracleXADataSource"/>
<property name="xaProperties">
<props>
<prop key="URL">${database2.jdbcUrl} </prop>
<prop key="user">${database2.user} </prop>
<prop key="password">${database2.password} </prop>
</props>
</property>
<property name="maxPoolSize"><value>30</value> </property>
</bean>
<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="240"/>
</bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<ref bean="atomikosTransactionManager"/>
</property>
<property name="userTransaction">
<ref bean="atomikosUserTransaction"/>
</property>
</bean>
经过测试,以上两种配置都可以实现分布式事务管理。