(个人观点)
在一个事务中包含多个数据源的更新操作时,需要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应用中配置多个数据源。 首先,我们来理解数据源(DataSource)的概念。数据源是Java中用于存储数据库连接信息的接口,它实现了JDBC规范中的`javax.sql.DataSource`接口。通过数据源,...
在多数据源配置中,spring 的 Annotation-Driven 配置事务管理器可以帮助我们轻松地管理多个数据源的事务。 在 Spring 框架中,事务管理器是通过 `<tx:annotation-driven>` 元素来配置的。在多数据源配置中,我们...
在Spring Boot应用中,多数据源配置是一项关键的技术,它允许我们同时管理多个数据库,比如主库和从库,或者不同类型的数据库。本教程将详细阐述如何在Spring Boot项目中实现这一功能,从数据源配置、实体管理到...
1. **配置多数据源**:Spring Boot提供了DataSourceAutoConfiguration,它允许我们配置多个数据源。每个数据源可以有自己的配置,如JDBC连接池、数据库驱动、URL、用户名和密码等。我们可以使用@...
- 使用双端队列(Deque)实现数据库的链式切换,这在处理需要顺序访问或循环访问多个数据源的场景中非常有用。 5. **事务内切换数据源**: - 引入了一个创新的特性,即在同一个事务内支持数据源的切换,并且兼容...
在大型分布式系统中,往往需要处理多个数据源,这就涉及到了Spring多数据源的配置和管理。同时,为了保证数据的一致性,分布式事务的管理也是必不可少的。在这个场景下,Atomikos作为一款开源的JTA(Java ...
JTA是Java平台中处理分布式事务的标准API,它允许应用程序在一个全局事务中操作多个资源(如数据库、消息队列等)。Spring Boot支持JTA事务管理,主要通过以下组件实现: 1. Atomikos:这是一个开源的JTA实现,提供...
- 配置过程中要确保每个数据源都有唯一的标识,以便于路由。 - 注意事务管理的配置,确保在多数据源环境下事务的一致性。 8. **应用场景**: - 分布式系统中,不同的服务可能需要连接不同的数据库。 - 高并发...
1. **数据源配置**:在Spring配置文件中,我们需要定义多个数据源bean,每个数据源对应一个数据库连接。这可能包括Druid或HikariCP这样的连接池配置。 2. **动态数据源**:Spring的AbstractRoutingDataSource类允许...
JTA是一个规范,它定义了接口和API,使得应用程序可以控制跨越多个数据存储(如数据库、消息队列等)的事务。它允许开发者编写无感知具体事务实现的代码,从而提高代码的可移植性和可维护性。 Spring通过...
本文将详细探讨如何在Spring环境中配置多个数据源,包括DataSource、SessionFactory、TransactionManager以及JTATransactionManager的设置。 #### 第一步:配置多个DataSource 在Spring中,配置多个数据源主要是...
本教程将详细介绍如何在Spring Boot项目中配置多个数据源,并利用`spring-data-jpa`进行数据操作。 首先,我们需要在`pom.xml`中添加必要的依赖。对于`spring-boot-starter-data-jpa`和MySQL的驱动,你需要如下依赖...
在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。Spring支持两种类型的事务管理:编程式事务管理和声明式事务管理。...
在上面的配置文件中,我们可以看到 `<bean>` 元素用于定义一个名为 "sgis.sdk.transactionManager" 的事务管理器,该管理器使用数据源连接池来管理事务。 Context 文件配置: Context 文件是 Spring AOP 的核心...
在Spring Boot项目中,默认情况下通常只需要配置一个数据源,即项目的主数据源。但在某些特定的应用场景下,如需要访问第三方系统的数据库或者处理跨系统的业务逻辑时,单个数据源就显得力不从心了。因此,多数据源...
总结来说,SpringBoot实现多数据源和动态切换的关键在于正确配置多个数据源,创建自定义的AOP切面和ThreadLocal上下文。在实际项目中,还需要考虑事务管理、异常处理等复杂情况,确保数据的一致性和安全性。通过理解...
2. 配置数据源:为每个数据源创建一个DataSource bean,使用Druid的配置类和属性配置不同的数据库连接。 3. 配置事务管理器:使用Atomikos的UserTransactionManager和JtaTransactionManager,注册到Spring Boot的...
这篇博客主要探讨了如何在Spring中配置和管理多个数据源,以便灵活地处理不同的数据库交互需求。 首先,我们要理解Spring的数据源管理。在Spring中,数据源(DataSource)是用于存储和获取数据库连接的对象。通常,...
在`application.properties`或`application.yml`中,为每个数据源定义不同的数据库连接信息,例如: ```properties # 数据源1(主库) spring.datasource.primary.url=jdbc:mysql://localhost:3306/master_db?...
Spring提供了一个名为`BasicDataSource`的类,它实现了`javax.sql.DataSource`接口,是最基础的数据源配置。在没有特殊需求的情况下,可以使用`BasicDataSource`。配置时,需要设置数据库URL、用户名、密码等属性。...