技术记录栈

记录点滴:java、datebase、linux、spring、javascript、nginx

2018/10/06

Spring Boot多数据源配置HikariCP连接池

Spring Boot允许外部化配置,而针对多数据库的静态多数据源的配置(使用HikariCP连接池),需要借助于Spring Boot这一特性来完成。

Spring Boot绑定配置参数的方式有很多种,这里说的静态多数据源配置,通过使用@ConfigurationProperties注解把参数绑定到结构化对象上。

这里使用HikariCP数据库连接池,所以如果使用其它连接池,需要先弄清楚连接池的参数配置。

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

然后通过Spring的@Bean注解给数据连接池对象取一个别名以便在需要的地方引用,在用到数据源的地方通过@Qualifier("beaName")注解选择数据源进行引用。

以上是使用HikariCP为Spring Boot配置多数据源的基本思路。以下是以HikariCP为数据库连接池在Spring Boot项目中配置多数据源的具体示例。

 

配置文件部分(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进行过多扩展的基础,进行静态多数据源的配置就完成了。