文档章节

Spring+Mybatis 实现多数据源和多事物配置

jeremyli90
 jeremyli90
发布于 2017/11/09 09:26
字数 729
阅读 95
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

没有相应的RPC接口,一个项目存在多个数据源,不想在代码端自己编写代码切换数据源?

你有可能需要下面的解决方案:

  • 多数据源配置

<!-- 数据源1配置 -->
 <bean id="dataSourceFor1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="${db1_url}" />
        <property name="username" value="$db1_user}" />
        <property name="password" value="${db1_passwd}" />
        <property name="maxWait" value="${db1_maxWait}" />
        <property name="maxActive" value="28" /> 
        <property name="initialSize" value="2" />
        <property name="minIdle" value="0" />
        <property name="timeBetweenEvictionRunsMillis" value="300000" />
        <property name="testOnBorrow" value="false" />
        <property name="testWhileIdle" value="true" />
        <property name="validationQuery" value="select 1 from dual" />
        <property name="filters" value="stat" />
    </bean>
 
<!-- 创建sqlSessionFactory1-->
<bean id="sqlSessionFactoryFor1" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="mapperLocations" value="classpath*:com/**/mapper1/*Mapper*.xml" /> 
        <property name="dataSource" ref="dataSourceFor1" />
</bean>
     
<!-- 配置扫描器,扫描指定路径的mapper生成数据库操作代理类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="annotationClass" value="javax.annotation.Resource"></property>
        <property name="basePackage" value="com.my.***.test.***.mapper1" />
        <property name="sqlSessionFactory" ref="sqlSessionFactoryFor1" />
</bean>
 
<!-- 数据源2配置 -->
 <bean id="dataSourceFor2" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="${db2_url}" />
        <property name="username" value="$db2_user}" />
        <property name="password" value="${db2_passwd}" />
        <property name="maxWait" value="${db2_maxWait}" />
        <property name="maxActive" value="28" /> 
        <property name="initialSize" value="2" />
        <property name="minIdle" value="0" />
        <property name="timeBetweenEvictionRunsMillis" value="300000" />
        <property name="testOnBorrow" value="false" />
        <property name="testWhileIdle" value="true" />
        <property name="validationQuery" value="select 1 from dual" />
        <property name="filters" value="stat" />
    </bean>
 
<!-- 创建sqlSessionFactory2-->
<bean id="sqlSessionFactoryFor2" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="mapperLocations" value="classpath*:com/**/mapper2/*Mapper*.xml" /> 
        <property name="dataSource" ref="dataSourceFor2" />
</bean>
   
<!-- 此处注意使用不同的sqlSessionFactory -->  
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="annotationClass" value="javax.annotation.Resource"></property>
        <property name="basePackage" value="com.my.***.test.***.mapper2" />
        <property name="sqlSessionFactory" ref="sqlSessionFactoryFor2" />
</bean>
  • 多事物配置

<bean id="transactionManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
    <property name="dataSource" ref="datasource1"></property>  
    <qualifier value="datasource1Tx"/>  
</bean>  
  
<bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
    <property name="dataSource" ref="datasource2"></property>  
    <qualifier value="datasource2Tx"/>  
</bean> 
  • 配置事物拦截器

注解方式

在spring-mybatis配置文件中打开注解配置

<!-- 开启 @Transactional 注解-->
<tx:annotation-driven/>  

上面的配置已经定义了多个transactional manager,并设置qualifier属性指定不同的值;然后在需要使用@Transactional注解的时候指定TransactionManager的qualifier属性值或者直接使用bean名称,示例如下:

public class TransactionalService {  
  
    @Transactional("datasource1Tx")  
    public void updateSomethingIntoDatasource1() { ... }  
  
    @Transactional("datasource2Tx")  
    public void saveSomethingIntoDatasource2() { ... }  
}  

/**
另一种方式: 
直接使用transactin manager 的bean名字来开启事物。
@Transactional("transactionManager1")
如果是使用@Transactional(),相当于使用缺省的transaction mananger名字,
即:@Transactional("transactionManager")
*/

注意:

上述配置方式只能保证同一数据源的事物的完整性,不保证一个service方法里有对多个数据源更新操作的事物的完整性。

如果一个事物里需要对多个数据源进行更新操作,需要使用到分布式事物,可以参考springmvc+mybatis+atomikos+JTA的实现方案,这里不做详细描述。

参考:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#tx-multiple-tx-mgrs-with-attransactional

© 著作权归作者所有

jeremyli90
粉丝 2
博文 91
码字总数 30882
作品 0
深圳
程序员
私信 提问
spring+mybatis 配置了三个数据源,事物失效

问题: spring+mybatis 配置了三个数据源,事物失效,手动使用 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 也不回滚; 背景: 有个项目使用SSM框架,需要访问...

太黑_thj
2017/04/11
243
0
Spring+MyBatis多数据源配置实现

jdbc和log4j的配置 #定义输出格式ConversionPattern=%d %-5p [%t] %c - %m%n log4j.rootLogger=DEBUG,Consolelog4j.logger.com.cnblogs.lzrabbit=DEBUGlog4j.logger.org.springframework=ER......

引鸩怼孑
2015/06/17
312
3
使用Spring Profile和Mybatis进行多个数据源(H2和Mysql)的切换

最近在做WebMagic的后台,遇到一个问题:后台用到了数据库,本来理想情况下是用Mysql,但是为了做到开箱即用,也整合了一个嵌入式数据库H2。这里面就有个问题了,如何用一套代码,提供对Mys...

黄亿华
2014/03/20
4.9K
3
spring+mybatis_多数据源配置

主从数据源配置 分库分表数据源配置 利用动态数据源和AOP实现分库 1.application.yml文件中配置多个数据源 2.配置多个 datasource bean 3.定义数据源枚举类 4.定义DynamicDataSource 该类继承...

grace_233
2018/10/07
95
0
springboot多数据源,最简单的整合方式

简介 相信大家有配置过多数据源,或者即将配置多数据的朋友们,会发现网上大概有以下几种方案: 1.使用AOP切片进行动态数据源切换 2.使用的配置不同的mapper目录以及template 3.数据库代理中...

louislivi
11/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

加载JDBC驱动

我们平时在连接数据库时需要加载驱动,通常做法是将JDBC驱动程序放在类路径中的某个位置,然后用Class.forName()查找并加载驱动程序。 这也就意味着要么将驱动程序打包到jar中,要么将驱动程...

uknow8692
26分钟前
4
0
TCP三次握手详情

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。 客户端在收发数据前要使用 conn...

vinci321
27分钟前
4
0
适用于PDF文件的MIME媒体类型

使用PDF时,我遇到了MIME类型application/pdf和application/x-pdf等。 这两种类型之间是否存在差异,如果是这样,它是什么? 一个比另一个更受欢迎吗? 我正在开发一个必须提供大量PDF的网络...

技术盛宴
34分钟前
5
0
Docker数据挂载

Docker数据管理 在容器中管理数据主要有两种方式: 数据卷(Volumes) 挂载主机目录(Bind mounts) 数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特...

CodingDiary
46分钟前
6
0
jQuery获取特定的选项标签文本

好吧,说我有这个: <select id='list'> <option value='1'>Option A</option> <option value='2'>Option B</option> <option value='3'>Option C</option></select> 如果我想......

javail
49分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部