1. 程式人生 > >基於springboot的多數據源自動配置實現

基於springboot的多數據源自動配置實現

產品 個數 com rop pri erro port 引用 基於

最近做了一個自動支持多數據源配置的功能,基於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的多數據源自動配置實現