1.为什么要组建多数据源? 一个系统中存在多个数据库读写操作,如Oralce+MySql......等 2.为什么要组建分布式事务? 在同一个系统,同一个事务中对不同数据库进行写操作时,如若一个失败,那么应该对多个数据库进行回滚操作,否则应该全部提交. 3.分布式事务有哪些? 在Spring 2.5中可以采用jta,在Spring3.X中则已经不对其提供支持,但可以使用atomikos.4.需要提供哪些jar包支持? 6个必须的jar包,可以通过maven下载atomikos-util-3.9.3.jar jta-1.1.jar transactions-3.9.3.jar transactions-api-3.9.3.jar transactions-jdbc-3.9.3.jar transactions-jta-3.9.3.jar 5.Spring 配置如何配置? <?xml version="1.0" encoding= "UTF-8"?> <beans xmlns= "http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop= "http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<context:annotation-config /> <context:component-scan base-package ="com.cn" />
<!-- oracle数据源定义 --> <bean id ="oracleDS" class= "com.atomikos.jdbc.AtomikosDataSourceBean" init-method= "init" destroy-method ="close"> <description >oracle xa datasource </description > <property name ="uniqueResourceName"> <value >oracle_ds </value > </property > <property name ="xaDataSourceClassName"> <value> oracle.jdbc.xa.client.OracleXADataSource</value > </property > <property name ="xaProperties"> <props > <prop key ="user">dongruan</ prop> <prop key ="password">dongruan</ prop> <prop key= "URL">jdbc:oracle:thin:@100.100.100.30:1521: orcl</ prop> <!-- 注意这个URL是大写 --> </props > </property > <property name ="testQuery"> <value >select 1 from dual </value > <!-- 尽量加上,不然会出现告警 --> </property > </bean >
<!-- mysql数据源定义 --> <bean id ="mysqlDS" class= "com.atomikos.jdbc.AtomikosDataSourceBean" init-method= "init" destroy-method ="close"> <description >mysql xa datasource</ description> <property name ="uniqueResourceName"> <value >mysql_ds </value > </property > <property name ="xaDataSourceClassName"> <value> com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value > </property > <property name ="xaProperties"> <props > <prop key ="user">datapre</ prop> <prop key ="password">flow2012</ prop> <prop key= "URL">jdbc:mysql://100.100.100.48:3306/ dataprepare</ prop> <!-- 注意这个URL是大写 --> </props > </property > <property name ="testQuery"> <value >select 1 </value ><!-- 尽量加上,不然会出现告警 --> </property > </bean >
<!-- oracle SqlSessionFactoryBean 和 MapperScanner配置 --> <bean id ="oracleSqlSession" class= "org.mybatis.spring.SqlSessionFactoryBean" > <property name ="dataSource" ref="oracleDS" /> <property name ="mapperLocations" value= "classpath:com/cn/oraclemapper/*Mapper.xml" /> <property name ="typeAliasesPackage" value= "com.cn.oraclepo" /> </bean > <bean id ="oracleMapperScanner" class= "org.mybatis.spring.mapper.MapperScannerConfigurer" > <property name ="sqlSessionFactoryBeanName" value= "oracleSqlSession" /> <property name ="basePackage" value= "com.cn.oraclemapper" /> </bean >
<!-- mysql SqlSessionFactoryBean 和 MapperScanner配置 --> <bean id ="mysqlSqlSessionFactory" class= "org.mybatis.spring.SqlSessionFactoryBean" > <property name ="dataSource" ref="mysqlDS" /> <property name ="mapperLocations" value= "classpath:com/cn/mapper/*Mapper.xml" /> <property name ="typeAliasesPackage" value= "com.cn.po" /> </bean > <bean id ="mysqlMapperScanner" class= "org.mybatis.spring.mapper.MapperScannerConfigurer" > <property name ="sqlSessionFactoryBeanName" value= "mysqlSqlSessionFactory" ></ property> <property name ="basePackage" value="com.cn.mapper" /> </bean >
<!-- atomikos事物管理器 --> <bean id ="atomikosUserTransaction" class= "com.atomikos.icatch.jta.UserTransactionImp" > <description >UserTransactionImp </description > <property name ="transactionTimeout" value= "300" /> </bean > <bean id ="atomikosTransactionManager" class= "com.atomikos.icatch.jta.UserTransactionManager" init-method= "init" destroy-method ="close"> <description >UserTransactionManager </description > <property name ="forceShutdown"> <value >true </value > </property > </bean > <bean id ="springTransactionManager" class= "org.springframework.transaction.jta.JtaTransactionManager" > <description >JtaTransactionManager </description > <property name ="transactionManager"> <ref bean ="atomikosTransactionManager" /> </property > <property name ="userTransaction"> <ref bean ="atomikosUserTransaction" /> </property > <property name ="allowCustomIsolationLevels" value= "true" /> <!-- 必须设置,否则程序出现异常 JtaTransactionManager does not support custom isolation levels by default --> </bean > <bean id ="atomikosTransactionProxy" class= "org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract ="true"> <property name ="transactionManager"> <ref bean ="springTransactionManager" /> </property > <property name ="transactionAttributes"> <props > <prop key= "*">PROPAGATION_REQUIRED,-Exception </prop > </props > </property > </bean >
<!-- 使用spring事务 --> <tx:annotation-driven transaction-manager="springTransactionManager" /> </beans> 6.测试代码如下: package com.cn.main; import java.io.UnsupportedEncodingException; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.cn.testService; public class main { public static void main(String[] args) throws UnsupportedEncodingException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("DataSource.xml" );
testService service = context.getBean(testService.class ); service.test(); } } 7.Service类: package com.cn; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.cn.mapper.SendPreMapper; import com.cn.oraclemapper.AirwayPointFlowMapper; import com.cn.oraclepo.AirwayPointFlow; import com.cn.po.SendPreWithBLOBs; @Service public class testService { @Autowired public SendPreMapper mysqlMapper; @Autowired public AirwayPointFlowMapper oracleMapper;
@Transactional public void test() { SendPreWithBLOBs pre = new SendPreWithBLOBs(); pre.setId(123457); mysqlMapper.insert(pre);
AirwayPointFlow air = new AirwayPointFlow(); air.setId( "11111111112"); oracleMapper.insert(air); } } |
Spring3.X 分布式事务
最新推荐文章于 2025-05-17 11:22:21 发布