最近公司对中心数据库进行了拆分,分解成了很多子库,然后再对子库进行水平分割,那么很麻烦的一个事情就是如何保证多数据源事务的完整性.
在网上找到了点资料,现已完成事务处理方面的需求,把过程总结一下:
1、首先从官网下载atomikos与jotm的开源项目
2、导入如下包至工程中
alib/jca.jar
alib/jms.jar
alib/jmx.jar
alib/jta.jar
alib/slf4j-api-1.4.3.jar
alib/slf4j-nop-1.4.3.jar
atomikos/atomikos-util.jar
atomikos/transactions.jar
atomikos/transactions-api.jar
atomikos/transactions-essentials-all.jar
atomikos/transactions-hibernate2.jar
atomikos/transactions-hibernate3.jar
atomikos/transactions-jdbc.jar
atomikos/transactions-jdbc-deprecated.jar
atomikos/transactions-jms.jar
atomikos/transactions-jms-deprecated.jar
atomikos/transactions-jta.jar
ibatis/ibatis-2.3.4.726.jar
jakarta-commons/commons-beanutils.jar
jakarta-commons/commons-codec-1.3.jar
jakarta-commons/commons-collections.jar
jakarta-commons/commons-dbcp.jar
jakarta-commons/commons-digester.jar
jakarta-commons/commons-discovery-0.2.jar
jakarta-commons/commons-fileupload-1.2.jar
jakarta-commons/commons-httpclient-3.0.jar
jakarta-commons/commons-io-1.3.1.jar
jakarta-commons/commons-lang.jar
jakarta-commons/commons-logging.jar
jakarta-commons/commons-logging-1.1.1.jar
jakarta-commons/commons-net-2.0.jar
jakarta-commons/commons-pool.jar
jakarta-commons/commons-validator.jar
jakarta-commons/log4j-1.2.14.jar
jdbc/mysql/mysql-connector-java-5.1.7-bin.jar
jotm/jotm-client.jar
jotm/jotm-core.jar
jotm/jotm-datasource.jar
jotm/jotm-jms.jar
jotm/jotm-standalone.jar
jotm/ow2-connector-1.5-spec.jar
jotm/ow2-jta-1.1-spec.jar
jotm/xapool.jar
junit/junit-4.4.jar
log4j/log4j-1.2.14.jar
objectweb/asm-all-3.1.jar
objectweb/cglib-nodep-2.1_3.jar
quartz/quartz-all-1.6.0-alpha.jar
spring/aopalliance-1.0.jar
spring/aspectjweaver.jar
spring/spring.jar
spring/spring-aspects.jar
spring/spring-mock.jar
common/activation.jar
jakarta-commons/jakarta-oro-2.0.8.jar
3、在classpath下添加jta.properties文件
#JTAtransction
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
com.atomikos.icatch.console_file_name=tm.release.out
com.atomikos.icatch.log_base_name=tm.releaselog
com.atomikos.icatch.tm_unique_name=com.atomikos.spring.jdbc.tm.release
com.atomikos.icatch.console_log_level=INFO
4、分别配置相关的数据源
(一)、配置Spring properties文件
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/classes/db-mailtask.properties</value>
</list>
</property>
</bean>
(二)应用主库数据源
<bean id="dataSource-unimail" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">
<property name="uniqueResourceName">
<value>${datasource.uniqueResourceName}</value>
</property>
<property name="xaDataSourceClassName">
<value>${database.driver_class}</value>
</property>
<property name="xaDataSourceProperties">
<value>URL=${database.url};user=${database.username};password=${database.password}</value>
</property>
<property name="exclusiveConnectionMode">
<value>${connection.exclusive.mode}</value>
</property>
<property name="connectionPoolSize">
<value>${connection.pool.size}</value>
</property>
<property name="connectionTimeout">
<value>${connection.timeout}</value>
</property>
<property name="validatingQuery">
<value>SELECT 1</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="namingStrategy">
<ref bean="namingStrategy" />
</property>
<property name="mappingResources">
<list>
<value>
XXXX.hbm.xml
</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
${hibernate.dialect}
</prop>
<prop key="hibernate.show_sql">
${hibernate.show_sql}
</prop>
<prop key="hibernate.hbm2ddl.auto">
${hibernate.hbm2ddl.auto}
</prop>
</property>
<property name="dataSource">
<ref bean="dataSource-unimail" />
</property>
</bean>
<bean id="CompanyChargeDetailDAO"
class="cn.unisoftware.unimail.dao.hibernate.CompanyChargeDetailDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
(三)配置从库数据源
<bean id="mail-dataSource" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">
<property name="uniqueResourceName">
<value>${mail.datasource.uniqueResourceName}</value>
</property>
<property name="xaDataSourceClassName">
<value>${mail.database.driver_class}</value>
</property>
<property name="xaDataSourceProperties">
<value>URL=${mail.database.url};user=${mail.database.username};password=${mail.database.password}</value>
</property>
<property name="exclusiveConnectionMode">
<value>${mail.connection.exclusive.mode}</value>
</property>
<property name="connectionPoolSize">
<value>${mail.connection.pool.size}</value>
</property>
<property name="connectionTimeout">
<value>${connection.timeout}</value>
</property>
<property name="validatingQuery">
<value>SELECT 1</value>
</property>
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation"><value>classpath:task-sqlMapConfig.xml</value></property>
<property name="dataSource" ref="mail-dataSource" />
</bean>
<bean id="mdaMessageInfoDAO" class="cn.unisoftware.unimail.mda.persistence.sqlmapdao.task.MdaMessageInfoSqlMapDao">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
(四) 事务处理部份
<!-- ========================= ASPECT CONFIGURATION ======================== -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<property name="forceShutdown" value="true"/>
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="${transaction.timeout}"/>
</bean>
<!-- JTA事务管理器 -->
<bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager"/>
<property name="userTransaction" ref="atomikosUserTransaction"/>
</bean>
<!-- 事务切面配置 -->
<aop:config>
<aop:pointcut id="serviceOperation" expression="execution(* *..service*..*(..))"/>
<aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/>
</aop:config>
<!-- 通知配置 -->
<tx:advice id="txAdvice" transaction-manager="springTransactionManager">
<tx:attributes>
<tx:method name="*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
分享到:
相关推荐
由于网上的多数据源事务的帖子大多是2010年以前的,现在spring都已经到4.X了,有些类已经弃用了。 原先很多都是用jotm实现的,但是由于spring的升级,totm的本地化实例那个类已经找不到了,所以我使用了atomikos。 ...
JTA是Java EE平台的一部分,提供了一种标准接口来管理和协调跨多个数据源的事务。它允许应用程序进行全局事务处理,即使这些操作涉及到不同的数据库或者其他资源管理器。 在Spring中,我们可以利用`...
1. Spring配置文件(如`applicationContext.xml`):配置Atomikos事务管理器和数据源。 2. 业务服务类:使用`@Transactional`注解的方法,展示事务的边界。 3. 数据库配置和实体类:与事务相关的数据库连接和数据...
通过分析JOTM源码,开发者可以自定义适配器以支持新的数据存储,或者优化现有事务处理逻辑,提高系统性能。此外,这对于理解其他Java事务管理框架如Atomikos、Bitronix等也有很大帮助。 6. **学习路径**: - 首先...
4. **处理分布式事务**:如果需要在多个数据源之间进行事务操作,可以考虑使用JTA和XAResource,但这通常需要数据库服务器支持X/Open XA协议。在J2EE环境下,Spring可以与应用服务器集成,利用其JTA服务。在J2SE环境...
3. **JTA事务协调器**:如Atomikos、JOTM等,它们是实现JTA的开源事务管理器。这些协调器负责监控和管理跨越多个数据库的事务,确保在异常情况下进行回滚或提交。 4. **Spring与ORM框架整合**:Spring可以与...
在Spring框架中,JTA(Java Transaction API)事务管理是一种用于处理分布式事务的高级机制,它允许应用程序在多个数据源之间进行协调的事务操作。本文将详细介绍如何在Spring中使用JTA事务管理,包括通过集成JOTM...
总的来说,跨多个数据库操作需要精细的事务管理,JTA提供了一个强大的解决方案,而Spring框架则简化了这个过程,使得开发者能够在各种环境下高效地处理多数据库事务。理解和熟练运用这些技术,对于构建健壮的、高...
分布式事务处理是分布式系统设计中非常重要的一环,尤其是在涉及多个服务或数据源的情况下。 #### 二、两阶段提交协议(2PC) 两阶段提交协议是解决分布式事务问题的经典算法之一。它主要分为两个阶段: 1. **准备...