Spring Boot静态多数据源配置

Spring Boot允许外部化配置。针对多数据库的静态多数据源配置,可以借助Spring Boot这一特性来完成。

Spring Boot绑定配置参数的方式有多种,这里说的静态多数据源配置,通过使用@ConfigurationProperties注解把参数绑定到结构化对象上。如果要对连接池参数进行绑定,就需要对连接池的参数名有所了解。

以HikariCP连接池为例,HikariCP连接池的初始化参数都在HikariConfig类中,所以这里的结构化配置对象直接继承了HikariConfig,通过@ConfigurationProperties指定对应的参数前缀,基本就完成了自动化参数配置。

通过Spring的@Bean注解给数据连接池对象取一个别名,以便在需要的地方引用,在使用数据源的地方通过@Qualifier("beaName")注解对数据源进行选择,当然,也可以通过Spring所提供的其他方式获取想要的对象。

配置文件部分(application.yml)

从第三行的缩进开始,参数名由具体的连接池,或数据源的参数决定,示例中以HikariCP的HikariConfig属性为例。

oracle:
  datasource: 
    poolName: oracleDataSource
    schema: orcl
    driverClassName: oracle.jdbc.OracleDriver
    jdbcUrl:jdbc:oracle:thin:@${orcl.db.url}:orcl
    username: ${orcl.db.un}
    password: ${orcl.db.pw}
mysql:
  datasource: 
    poolName: mysqlDataSource
    schema: test
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://${mysql.db.url}/test
    username: ${mysql.db.un}
    password: ${mysql.db.pw}

结构化参数配置

@Configuration
@ConfigurationProperties(prefix = "oracle.datasource")
public class OracleDbConfig extends HikariConfig {

  @Bean(name = "oracleDataSource")
  public DataSource dataSource() throws SQLException {
    return new HikariDataSource(this);
  }

}
@Configuration
@ConfigurationProperties(prefix = "mysql.datasource")
public class MysqlDbConfig extends HikariConfig {

  @Bean(name = "mysqlDataSource")
  public DataSource dataSource() throws SQLException {
    return new HikariDataSource(this);
  }

}

引用多数据源

@Component
public class OrclArticleDao implements CommandLineRunner {

  private final DSLContext create;

  public OrclArticleDao(@Qualifier("oracleDataSource") DataSource dataSource) {
    create = new DefaultDSLContext(dataSource, SQLDialect.DEFAULT);
  }

}
@Component
public class MysqlArticleDao implements CommandLineRunner {

  private final DSLContext create;

  public MysqlArticleDao(@Qualifier("mysqlDataSource") DataSource dataSource) {
    create = new DefaultDSLContext(dataSource, SQLDialect.MYSQL_8_0);
  }

}

至此,在不对spring进行过多扩展的基础,进行静态多数据源的配置就完成了。