基于springboot的多数据源自动配置实现

Posted hibugs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于springboot的多数据源自动配置实现相关的知识,希望对你有一定的参考价值。

最近做了一个自动支持多数据源配置的功能,基于springboot生态扩展,可自动识别配置文件中的数据库配置参数,并进行autoconfig。

multiple-datasource多数据源支持模块

功能性

  • 支持自动化配置多个数据源;
  • 支持自动化配置持久层框架(mybatis);
  • 支持自动化配置分布式事务管理器(JTA-Atomikos);
  • 支持不同数据源使用不同数据库;
  • 支持不同数据源使用不同数据库且使用不同连接池(hikari、dbcp2、tomcat-pool、druid等);
  • 支持自动适配不同数据库分页特性,自动分页(pagehelper)。

非功能性

  • 基于springboot环境运行;
  • 非侵入式,不影响springboot其他配置。
  • 支持通过配置文件灵活切换、调整、分配数据源。

注意事项

  • 多数据源分布式事务下,首先需要使用支持XA的数据库产品,目前主流数据库如oracle、db2、mysql等都支持
  • 需要对数据库用户进行分布式事务相关授权,如下,否则会提示错误:

    ResourceException: Error in recovery
    grant select on sys.dba_pending_transactions to jeesite; grant select on sys.pending_trans$ to jeesite; grant select on sys.dba_2pc_pending to jeesite; grant execute on sys.dbms_system to jeesite;

如何使用

1、要使用多数据源自动配置,需要将springboot自带的DataSource相关自动配置类屏蔽自动启动。在springboot项目的启动类上添加如下注解(若引用了druid等第三方数据源,也需将其自配置类屏蔽)

@EnableAutoConfiguration(exclude = { XADataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class,DataSourceAutoConfiguration.class})

2、配置applicaion.properties参数

DataSource相关配置

  • spring.multi-datasource 为识别多数据源配置的prefix,其他参数基本继承自各框架自身提供的可配置参数,只有prefix不同,例如:
    spring.multi-datasource.xxx.*等同于Spring DataSource配置:spring.datasource.*
    spring.multi-datasource.xxx.mybatis.* 等同于mybatis配置:mybatis.*
  • spring.multi-datasource.xxx xxx为可自定义的数据源名称,用于区分不同数据源,全局唯一,且不同数据源的配置相互独立
  • spring.multi-datasource.xxx.xa.* 提供配置支持分布式事务的数据源的相关参数,若要使用druid连接池,则需要使用spring.multi-datasource.oracle.xa.data-source-class-name 指定druid数据源名称,默认使用springboot数据源构造器,默认连接池为Hikari

myabits相关配置

  • 使用prefix spring.multi-datasource.xxx.mybatis.*代替mybatis的配置prefixmybatis.*即可
    不同数据源配置的mybatis只对当前数据源有效,所以可实现不同模块使用不同数据源,例如:
    spring.multi-datasource.oracle.mybatis.mapper-locations=classpath*:mybatis/*1Mapper.xml spring.multi-datasource.oracle.mybatis.type-aliases-package=com.cvicse.test.bo.base spring.multi-datasource.oracle.base-packages=com.cvicse.test.dao

pagehelper相关配置

  • 使用prefix spring.multi-datasource.mysql.pagehelper.*代替pagehelper的配置prefixpagehelper.*即可

application.properties 参考

server.port=8080

spring.multi-datasource.oracle.xa.data-source-class-name=com.alibaba.druid.pool.xa.DruidXADataSource
spring.multi-datasource.oracle.driver-class-name=oracle.jdbc.OracleDriver
spring.multi-datasource.oracle.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
spring.multi-datasource.oracle.username=******
spring.multi-datasource.oracle.password=******
spring.multi-datasource.oracle.mybatis.mapper-locations=classpath*:mybatis/*1Mapper.xml
spring.multi-datasource.oracle.mybatis.type-aliases-package=com.cvicse.test.bo.base
spring.multi-datasource.oracle.base-packages=com.cvicse.test.dao

spring.multi-datasource.db2.username=******
spring.multi-datasource.db2.password=******
spring.multi-datasource.db2.url=jdbc:db2://127.0.0.1:50000/msdb
spring.multi-datasource.db2.mybatis.mapper-locations=classpath*:mybatis/*2Mapper.xml
spring.multi-datasource.db2.mybatis.type-aliases-package=com.cvicse.test2.bo.base
spring.multi-datasource.db2.base-packages=com.cvicse.test2.dao


spring.multi-datasource.mysql.username==******
spring.multi-datasource.mysql.password==******
spring.multi-datasource.mysql.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useSSL=true
spring.multi-datasource.mysql.mybatis.mapper-locations=classpath*:mybatis/*2Mapper.xml
spring.multi-datasource.mysql.mybatis.type-aliases-package=com.cvicse.test2.bo.base
spring.multi-datasource.mysql.base-packages=com.cvicse.test2.dao

以上是关于基于springboot的多数据源自动配置实现的主要内容,如果未能解决你的问题,请参考以下文章

springboot基于方法级别注解事务的多数据源切换问题

SpringBoot 的多数据源配置与动态切换

SpringBoot 的多数据源配置与动态切换

SpringBoot 的多数据源配置与动态切换

Spring动态配置多数据源的基于spring和ibatis的多数据源切换方案

SpringBoot自动配置原理及如何创建自己的Starter