文档章节

spring boot Druid多数据源 分布式事务(jta.atomikos)

边鹏_尛爺鑫
 边鹏_尛爺鑫
发布于 2018/01/18 18:29
字数 889
阅读 379
收藏 8

SpringBoot 多数据源配置

spring 多数据源配置一般有两种方案:

1、在spring项目启动的时候直接配置两个不同的数据源,不同的sessionFactory。在dao 层根据不同业务自行选择使用哪个数据源的session来操作。

2、配置多个不同的数据源,使用一个sessionFactory,在业务逻辑使用的时候自动切换到不同的数据源,有一个种是在拦截器里面根据不同的业务现切换到不同的datasource;有的会在业务层根据业务来自动切换。但这种方案在多线程并发的时候会出现一些问题,需要使用threadlocal等技术来实现多线程竞争切换数据源的问题。

【我就只讨论第一种方案】

spring多事务配置主要体现在db配置这块,配置不同的数据源和不同的session

1、pom.xml核心包:

<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>${mybatis-spring-boot-starter.version}</version>
</dependency>
<!-- 阿里 连接池 -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>${druid.version}</version>
</dependency>
<!--分布式事务支持 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>

2、application.yml属性配置:

spring:
  datasource:
    one:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://192.168.1.206:3306/testOne?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false
      username: root
      password: 1234
    two:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://192.168.1.206:3306/testTwo?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false
      username: root
      password: 1234

3、接收数据源①:dataSource的Properties

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data;

@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.one")
public class OneDataSourceProperties {

    private String driverClassName;

    private String url;

    private String username;

    private String password;
}

4、设置①:dataSource

@Configuration
@MapperScan(basePackages = "com.xin.dream.one.dao", sqlSessionTemplateRef = "oneSqlSessionTemplate")
public class OneDatabaseConfig {
	@Autowired
	public OneDataSourceProperties oneDataSourceProperties;
	@Primary
	@Bean(name = "oneDataSource", destroyMethod = "close")
	public DataSource oneDataSource() {
		DruidXADataSource datasource = new DruidXADataSource();
    	BeanUtils.copyProperties(oneDataSourceProperties,datasource);
    	AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
        xaDataSource.setXaDataSource(datasource);
        xaDataSource.setUniqueResourceName("oneDataSource");
        return xaDataSource;
	}

	@Primary
	@Bean(name = "oneSqlSessionFactory")
	public SqlSessionFactory oneSqlSessionFactory(@Qualifier("oneDataSource") DataSource oneDataSource)
			throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(oneDataSource);
		ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
		bean.setMapperLocations(resolver.getResources("classpath:com/xin/dream/one/mapper/*.xml"));
		return bean.getObject();
	}

	@Primary
	@Bean(name = "oneSqlSessionTemplate")
	public SqlSessionTemplate oneSqlSessionTemplate(
			@Qualifier("oneSqlSessionFactory") SqlSessionFactory oneSqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(oneSqlSessionFactory);
	}
}

5、第②数据源和①的步骤一样,改掉别名,和去掉@Primary,就好了。这个时候事务已经是被管理的了

源码地址:https://gitee.com/bianxin.com/SpringBootAtomikos

在开发中遇见问题

配置文件:

spring:
  jta:
    atomikos:
      datasource:
        oneData:
          max-pool-size: 25
          min-pool-size: 3
          max-lifetime: 20000
          xa-data-source-class-name: com.alibaba.druid.pool.xa.DruidXADataSource
          borrow-connection-timeout: 10000
          unique-resource-name: fs
          xa-properties:
            password: 1234
            username: root
            url: jdbc:mysql://192.168.1.206:3306/testOne?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false
        twoData:
          max-pool-size: 25
          min-pool-size: 3
          max-lifetime: 20000
          xa-data-source-class-name: com.alibaba.druid.pool.xa.DruidXADataSource
          unique-resource-name: party
          borrow-connection-timeout: 10000 
          xa-properties:
            password: 1234
            username: root
            url: jdbc:mysql://192.168.1.206:3306/testOne?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false
    enabled: true

为了节减代码量dataSource配置文件为:

@Configuration
@MapperScan(basePackages = "com.xin.dream.one.dao", sqlSessionTemplateRef = "oneSqlSessionTemplate")
public class OneDatabaseConfig {
	
	@Primary
	@Bean(name = "oneDataSource", destroyMethod = "close")
	@ConfigurationProperties(prefix = "spring.jta.atomikos.datasource.oneData")
	public DataSource oneDataSource() {
		return new AtomikosDataSourceBean();
	}

	@Primary
	@Bean(name = "oneSqlSessionFactory")
	public SqlSessionFactory oneSqlSessionFactory(@Qualifier("oneDataSource") DataSource oneDataSource)
			throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(oneDataSource);
		ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
		bean.setMapperLocations(resolver.getResources("classpath:com/xin/dream/one/mapper/*.xml"));
		return bean.getObject();
	}

	@Primary
	@Bean(name = "oneSqlSessionTemplate")
	public SqlSessionTemplate oneSqlSessionTemplate(
			@Qualifier("oneSqlSessionFactory") SqlSessionFactory oneSqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(oneSqlSessionFactory);
	}

}

当有多个数据源的时候报错:

Caused by: com.atomikos.jdbc.AtomikosSQLException: Cannot initialize AtomikosDataSourceBean
	at com.atomikos.jdbc.AtomikosSQLException.throwAtomikosSQLException(AtomikosSQLException.java:46) ~[transactions-jdbc-3.9.3.jar:na]
	at com.atomikos.jdbc.AbstractDataSourceBean.init(AbstractDataSourceBean.java:306) ~[transactions-jdbc-3.9.3.jar:na]
	at org.springframework.boot.jta.atomikos.AtomikosDataSourceBean.afterPropertiesSet(AtomikosDataSourceBean.java:49) ~[spring-boot-1.5.9.RELEASE.jar:1.5.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	... 80 common frames omitted
Caused by: java.lang.IllegalArgumentException: argument type mismatch
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_131]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_131]
	at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_131]
	at com.atomikos.beans.PropertyUtils.setDirectProperty(PropertyUtils.java:205) ~[atomikos-util-3.9.3.jar:na]
	at com.atomikos.beans.PropertyUtils.setProperty(PropertyUtils.java:110) ~[atomikos-util-3.9.3.jar:na]
	at com.atomikos.beans.PropertyUtils.setProperties(PropertyUtils.java:186) ~[atomikos-util-3.9.3.jar:na]
	at com.atomikos.jdbc.AtomikosDataSourceBean.doInit(AtomikosDataSourceBean.java:196) ~[transactions-jdbc-3.9.3.jar:na]
	at com.atomikos.jdbc.AbstractDataSourceBean.init(AbstractDataSourceBean.java:296) ~[transactions-jdbc-3.9.3.jar:na]
	... 83 common frames omitted

我跟踪了源码,水平有限,暂时还没弄懂原因,想直接new AtomikosDataSourceBean()或者简单的赋值,怎么弄?望朋友们指点下?

© 著作权归作者所有

共有 人打赏支持
边鹏_尛爺鑫
粉丝 29
博文 30
码字总数 24774
作品 0
成都
程序员
私信 提问
加载中

评论(5)

夜辰
夜辰

引用来自“夜辰”的评论

大佬,那个问题解决了么?

引用来自“边鹏_尛爺鑫”的评论

希望对你有所帮助
非常感谢!
夜辰
夜辰

引用来自“夜辰”的评论

大佬,那个问题解决了么?

引用来自“边鹏_尛爺鑫”的评论

希望对你有所帮助
非常感谢!
边鹏_尛爺鑫
边鹏_尛爺鑫

引用来自“夜辰”的评论

大佬,那个问题解决了么?
希望对你有所帮助
边鹏_尛爺鑫
边鹏_尛爺鑫

引用来自“夜辰”的评论

大佬,那个问题解决了么?
https://my.oschina.net/bianxin/blog/1610100
夜辰
夜辰
大佬,那个问题解决了么?
spring boot + jta + druid整合demo

地址: https://gitee.com/liuchangng/springboot-mybatis-jta 项目使用到的技术如下: spring boot mybatis jta (分布式事务) druid (多数据源) 地址: https://gitee.com/liuchangng/springbo......

liuchangng
2017/09/28
0
1
苞米豆多数据源启动器 2.0.1 发布,Bug 修复版本

苞米豆多数据源启动器 2.0.1 发布了。强烈建议升级!更新内容: 修复一个方法缓存的bug,会引起同名方法的注解失效。 底层代码的重命名和部分格式的调整。 源码地址: https://gitee.com/ba...

小锅盖
2018/08/09
501
4
fast-spring-boot 快速开发项目

Introduction fast-spring-boot 集成Spring Boot 2.1,Mybatis,Mybatis Plus,Druid,FastJson,Redis,Rabbit MQ,Kafka等,可使用代码生成器快速开发项目,使用maven assembly打包发布 项目主页 ......

geekidea
2018/12/10
0
0
Spring Boot 2.0配置druid

第一种方式: 1、引入相关的包,刚开始没引入log4j包,一直报错。 2、添加druid相关的属性配置,具体各属性的意思,可以找官网或百度上去搜。 运行即可。 第二种方式: 均源于阿里参考:htt...

sam_l
2018/08/03
0
0
Spring Boot整合MyBatis学习总结

公司的很多项目都陆陆续续引入了Spring Boot,通过对Spring Boot的接触了解发现其真的是大大地简化了开发、简化了依赖配置,很多功能注解一下就可以实现,真的是太方便了。下面记录了一个Spr...

zhuwensheng
2018/06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前嗅ForeSpider脚本教程:标准对象(一)

今天,小编主要为大家介绍一下:前嗅ForeSpider脚本中的标准对象:爬虫链接类url,urltext采集的所有状态及属性类,html标签节点类domItem和(html)dom类dom。具体内容如下: 一.爬虫链接类...

forespider
23分钟前
1
0
javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify

在使用spring boot整合jpa时出现上述错误,在配置文件中,配置连接数据库的url时,加上useSSL=false url: jdbc:mysql://127.0.0.1:3306/数据库名称?serverTimezone=Asia/Shanghai&useSSL=fa...

朝如青丝暮成雪
33分钟前
1
0
JavaScript 为什么要有 Symbol 类型?

摘要: 为什么比怎么用更有意义。 原文:JavaScript 为什么要有 Symbol 类型 作者:前端小智 Symbols 是 ES6 引入了一个新的数据类型 ,它为 JS 带来了一些好处,尤其是对象属性时。 但是,它...

Fundebug
35分钟前
0
0
vs code 配置.json文件引入makefile文件实现多文件编译

背景: 之前使用VS code写c++时,没使用到多文件,所以对launch.jason和task.jason配置没过多配置,但不支持多文件间的编译,调试。 注:主要针对较大的一些工程,涉及多个文件的编译,使用到...

shzwork
35分钟前
1
0
大神教你Nginx常用基础配置方案

Nginx的fastcgi模块参数设置 Nginx 有两个配置文件fastcgi_params、fastcgi.conf,两者唯一的区别是,fastcgi.conf 多一个参数 SCRIPT_FILENAME,diff显示如下: $diff fastcgi fastcgi_param...

Linux就该这么学
41分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部