由于项目的需要,初步学习了分布式事务的相关知识,了解了可以和tomcat集成的几款分布式软件,在此基础之上,将事务处理和项目集成到了一起。
应用层采用了spring的声明式事务处理方式,经过测试知道sping本身支持单数据源的跨表事务。
集成了jotm后,对跨数据源的事务进行统一管理。经过测试,可以通过配置文件的方式将jotm和spring较好的集成在一起。
项目使用的框架:struts2+spring2.5
数据库:mysql5
第三方事务软件:jotm2.2.1
下面是配置文件,仅供参考。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<bean id="dsDefault" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager" ref="jotm"/>
<property name="driverName" value="org.logicalcobwebs.proxool.ProxoolDriver" />
<property name="url" value="proxool.guopei" />
</bean>
<bean id="dsTestLocal" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager" ref="jotm"/>
<property name="driverName" value="org.logicalcobwebs.proxool.ProxoolDriver" />
<property name="url" value="proxool.test" />
</bean>
<bean id="dsTestVm" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager" ref="jotm"/>
<property name="driverName" value="org.logicalcobwebs.proxool.ProxoolDriver" />
<property name="url" value="proxool.vm" />
</bean>
<!--JOTM本地实例-->
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>
<!--JTA事务管理器-->
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="jotm"/><!--指定userTransaction属性引用JOTM本地实例-->
</bean>
<!--XAPool配置,内部包含了一XA数据源,对应了数据库jtatesta支持JTA事务的数据源,必须封装成XAPool-->
<bean id="jtaDs" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource">
<ref local="dsDefault" />
</property>
</bean>
<!--类似地,对应了数据库jtatestb的XAPool配置,内部包含了一XA数据源-->
<bean id="jtaTest" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource">
<ref local="dsTestLocal" />
</property>
</bean>
<bean id="jtaVm" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource">
<ref local="dsTestVm" />
</property>
</bean>
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="txManager" />
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED, -Throwable</prop>
<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
</props>
</property>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="proxyTargetClass">
<value>true</value>
</property>
<property name="beanNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<bean id="singleDsService" class="com.test.service.SingleDsService">
</bean>
<bean id="dsMultiService" class="com.test.service.DsMultiService">
<property name="dsLocalGuopeiDao" ref="dsLocalGuopeiDao"/>
<property name="dsLocalTestDao" ref="dsLocalTestDao"/>
<property name="dsVmTestDao" ref="dsVmTestDao"/>
</bean>
<bean id="dsLocalGuopeiDao" class="com.test.dao.DsLocalGuopeiDao">
<property name="dataSource" ref="jtaDs" />
</bean>
<bean id="dsLocalTestDao" class="com.test.dao.DsLocalTestDao">
<property name="dataSource" ref="jtaTest" />
</bean>
<bean id="dsVmTestDao" class="com.test.dao.DsVmTestDao">
<property name="dataSource" ref="jtaVm" />
</bean>
</beans>
本文介绍了一个使用Spring框架结合JOTM实现分布式事务处理的案例。通过配置Spring和JOTM来支持跨数据源的事务一致性,并展示了具体的XML配置文件。
419

被折叠的 条评论
为什么被折叠?



