`

Spring配置一个事务中多个数据源

阅读更多

(个人观点)

  在一个事务中包含多个数据源的更新操作时,需要JTA的支持,通常JTA的支持是由J2EE容器提供的(WAS,Weblogic...),也有单独实现JTA的第3方jar。

 

  Spring提供的是jotm和xapool,但在配置过程中遇到了问题,使用org.enhydra.jdbc.standard.StandardXADataSource做数据源时,它的shutdown方法是带参数的

<bean id="innerMysqlDataSource" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
...
</bean>

 

  xapool的文档做的不好就没有继续,又找了另一个,AtomikosTransactionsEssentials(支持JMS和JDBC作为数据源)。

 

<?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:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <tx:annotation-driven />
    
    <bean id="DS1" class="com.atomikos.jdbc.AtomikosDataSourceBean"
        init-method="init" destroy-method="close">
        <property name="uniqueResourceName">
            <value>DB1</value>
        </property>
        <property name="xaDataSourceClassName">
            <value>com.ibm.db2.jcc.DB2XADataSource</value>
        </property>
        <property name="xaProperties">
            <props>
                <prop key="serverName">XXX</prop>
                <prop key="portNumber">50000</prop>
                <prop key="databaseName">DB1</prop>
                <prop key="driverType">4</prop>
                <prop key="user">XXX</prop>
                <prop key="password">XXX</prop>
            </props>
        </property>
        <property name="maxIdleTime" value="XXX" />
        <property name="maxPoolSize" value="XXX" />
        <property name="minPoolSize" value="XXX" />
    </bean>

    <bean id="DS2" class="com.atomikos.jdbc.AtomikosDataSourceBean"
        init-method="init" destroy-method="close">
        <property name="uniqueResourceName">
            <value>DB2</value>
        </property>
        <property name="xaDataSourceClassName">
            <value>com.ibm.db2.jcc.DB2XADataSource</value>
        </property>
        <property name="xaProperties">
            <props>
                <prop key="serverName">XXX</prop>
                <prop key="portNumber">50000</prop>
                <prop key="databaseName">DB2</prop>
                <prop key="driverType">4</prop>
                <prop key="user">XXX</prop>
                <prop key="password">XXX</prop>
            </props>
        </property>
         <property name="maxIdleTime" value="XXX" />
        <property name="maxPoolSize" value="XXX" />
        <property name="minPoolSize" value="XXX" />
    </bean>

    <!--
        Construct Atomikos UserTransactionManager, needed to configure
        Spring
    -->
    <bean id="userTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
    init-method="init" destroy-method="close">
        <!--
            when close is called, should we force transactions to
            terminate or not?
        -->
        <property name="forceShutdown">
            <value>true</value>
        </property>
    </bean>

    <!--
        Also use Atomikos UserTransactionImp, needed to configure Spring
    -->
    <bean id="userTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
        <property name="transactionTimeout">
            <value>300</value>
        </property>
    </bean>

    <!--
        Configure the Spring framework to use JTA transactions from
        Atomikos
    -->
    <bean id="transactionManager"
        class="org.springframework.transaction.jta.JtaTransactionManager">

        <property name="transactionManager">
            <ref bean="userTransactionManager" />
        </property>
        <property name="userTransaction">
            <ref bean="userTransaction" />
        </property>
    </bean>

</beans>

 

  xaDataSourceClassName是设置javax.sql.XADataSource(使用DB的驱动提供),其中xaProperties是Map类型的,通过反射设置javax.sql.XADataSource的属性。例子中使用的是DB2。

分享到:
评论

相关推荐

    Spring配置多个数据源

    本文将详细介绍如何在Spring应用中配置多个数据源。 首先,我们来理解数据源(DataSource)的概念。数据源是Java中用于存储数据库连接信息的接口,它实现了JDBC规范中的`javax.sql.DataSource`接口。通过数据源,...

    spring的annotation-driven配置事务管理器详解 (多数据源配置

    在多数据源配置中,spring 的 Annotation-Driven 配置事务管理器可以帮助我们轻松地管理多个数据源的事务。 在 Spring 框架中,事务管理器是通过 `&lt;tx:annotation-driven&gt;` 元素来配置的。在多数据源配置中,我们...

    spring boot多数据源配置

    在Spring Boot应用中,多数据源配置是一项关键的技术,它允许我们同时管理多个数据库,比如主库和从库,或者不同类型的数据库。本教程将详细阐述如何在Spring Boot项目中实现这一功能,从数据源配置、实体管理到...

    Springcloud 多数库 多数据源整合,查询动态切换数据库

    1. **配置多数据源**:Spring Boot提供了DataSourceAutoConfiguration,它允许我们配置多个数据源。每个数据源可以有自己的配置,如JDBC连接池、数据库驱动、URL、用户名和密码等。我们可以使用@...

    Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

    - 使用双端队列(Deque)实现数据库的链式切换,这在处理需要顺序访问或循环访问多个数据源的场景中非常有用。 5. **事务内切换数据源**: - 引入了一个创新的特性,即在同一个事务内支持数据源的切换,并且兼容...

    Spring多数据源分布式事务管理

    在大型分布式系统中,往往需要处理多个数据源,这就涉及到了Spring多数据源的配置和管理。同时,为了保证数据的一致性,分布式事务的管理也是必不可少的。在这个场景下,Atomikos作为一款开源的JTA(Java ...

    Springboot 动态多数据源 jta分布式事务

    JTA是Java平台中处理分布式事务的标准API,它允许应用程序在一个全局事务中操作多个资源(如数据库、消息队列等)。Spring Boot支持JTA事务管理,主要通过以下组件实现: 1. Atomikos:这是一个开源的JTA实现,提供...

    spring 动态多数据源配置代码

    - 配置过程中要确保每个数据源都有唯一的标识,以便于路由。 - 注意事务管理的配置,确保在多数据源环境下事务的一致性。 8. **应用场景**: - 分布式系统中,不同的服务可能需要连接不同的数据库。 - 高并发...

    SSM(Spring+SpringMVC+MyBatis)多数据源配置框架

    1. **数据源配置**:在Spring配置文件中,我们需要定义多个数据源bean,每个数据源对应一个数据库连接。这可能包括Druid或HikariCP这样的连接池配置。 2. **动态数据源**:Spring的AbstractRoutingDataSource类允许...

    Spring配置JTA事务管理

    JTA是一个规范,它定义了接口和API,使得应用程序可以控制跨越多个数据存储(如数据库、消息队列等)的事务。它允许开发者编写无感知具体事务实现的代码,从而提高代码的可移植性和可维护性。 Spring通过...

    Spring多数据源配置

    本文将详细探讨如何在Spring环境中配置多个数据源,包括DataSource、SessionFactory、TransactionManager以及JTATransactionManager的设置。 #### 第一步:配置多个DataSource 在Spring中,配置多个数据源主要是...

    Spring Boot使用spring-data-jpa配置Mysql多数据源

    本教程将详细介绍如何在Spring Boot项目中配置多个数据源,并利用`spring-data-jpa`进行数据操作。 首先,我们需要在`pom.xml`中添加必要的依赖。对于`spring-boot-starter-data-jpa`和MySQL的驱动,你需要如下依赖...

    spring事务与数据库操作

    在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。Spring支持两种类型的事务管理:编程式事务管理和声明式事务管理。...

    SpringBoot多数据源配置(方式一:配置多个mapper扫描不同的包路径实现多数据源配置).docx

    在Spring Boot项目中,默认情况下通常只需要配置一个数据源,即项目的主数据源。但在某些特定的应用场景下,如需要访问第三方系统的数据库或者处理跨系统的业务逻辑时,单个数据源就显得力不从心了。因此,多数据源...

    Spring AOP配置事务方法

    在上面的配置文件中,我们可以看到 `&lt;bean&gt;` 元素用于定义一个名为 "sgis.sdk.transactionManager" 的事务管理器,该管理器使用数据源连接池来管理事务。 Context 文件配置: Context 文件是 Spring AOP 的核心...

    SpringBoot配置多数据源实现动态切换数据源

    总结来说,SpringBoot实现多数据源和动态切换的关键在于正确配置多个数据源,创建自定义的AOP切面和ThreadLocal上下文。在实际项目中,还需要考虑事务管理、异常处理等复杂情况,确保数据的一致性和安全性。通过理解...

    Spring Boot + Druid + Mybatis + Atomikos 配置多数据源 并支持分布式事务

    2. 配置数据源:为每个数据源创建一个DataSource bean,使用Druid的配置类和属性配置不同的数据库连接。 3. 配置事务管理器:使用Atomikos的UserTransactionManager和JtaTransactionManager,注册到Spring Boot的...

    Spring Boot多数据源(JdbcTemplate)配置与使用

    在Spring Boot应用中,我们经常需要处理来自多个数据源的数据,比如在开发微服务架构时,每个服务可能对应一个特定的数据源。`JdbcTemplate`是Spring框架提供的一个用于简化数据库操作的工具,它使得数据库访问更为...

    Spring管理配置多个数据源

    这篇博客主要探讨了如何在Spring中配置和管理多个数据源,以便灵活地处理不同的数据库交互需求。 首先,我们要理解Spring的数据源管理。在Spring中,数据源(DataSource)是用于存储和获取数据库连接的对象。通常,...

    springboot实现多数据源而且加上事务不会使aop切换数据源失效

    在`application.properties`或`application.yml`中,为每个数据源定义不同的数据库连接信息,例如: ```properties # 数据源1(主库) spring.datasource.primary.url=jdbc:mysql://localhost:3306/master_db?...

Global site tag (gtag.js) - Google Analytics