最近一个项目用到连多个数据库的操作经过选型选用了,多源扫描不同DAO目录的方式。详情类似于 https://blog.csdn.net/wangh92/article/details/100163693的方式进行配置发现 DEBUG 时JVM 只加载了一个连接池,另一个出现HikariDataSource(null) 问题。
后从https://www.jianshu.com/p/e315822a523d添加链接描述想了个折中的办法如下:
1.DataSource修改
@Bean(name = "dataSource2")
//@ConfigurationProperties(prefix = "spring.datasource.mysql2")
public DataSource dataSource(Environment env) {
HikariConfig config= DataSourceConfigUtil.setDataSourceEnvConfig("spring.datasource.mysql2.","spring.datasource.mysql2.hikari.",env);
HikariDataSource dataSource = new HikariDataSource(config);
return dataSource;
}
2.添加 HikariConfig 工具类
package com.sunmnet.iot.bjsf.utils;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.env.Environment;
/**
* @program: bjsf
* @description: pool bind 方法增强方法
* @author: yujie
* @create: 2020-09-10 11:11
**/
public class DataSourceConfigUtil {
public static HikariConfig setDataSourceEnvConfig(String prefix1,String prefix, Environment env) {
HikariConfig config = new HikariConfig();
String driver=env.getProperty(prefix1 + "driver-class-name");
String dataSourceUrl= env.getProperty(prefix1 + "jdbcUrl");
String user=env.getProperty(prefix1 + "username");
String password=env.getProperty(prefix1 + "password");
String minimumIdle = env.getProperty(prefix + "minimumIdle");
String maximumPoolSize = env.getProperty(prefix + "maximumPoolSize");
String autoCommit = env.getProperty(prefix + "autoCommit");
String idleTimeout = env.getProperty(prefix + "idleTimeout");
String poolName = env.getProperty(prefix + "poolName");
String maxLifetime = env.getProperty(prefix + "maxLifetime");
String connectionTimeout = env.getProperty(prefix + "connectionTimeout");
String dataSourceClassName= env.getProperty(prefix+ "type");
if (StringUtils.isNotBlank(dataSourceUrl)){
config.setJdbcUrl(dataSourceUrl);
}
if (StringUtils.isNotBlank(user)){
config.setUsername(user);
}
if (StringUtils.isNotBlank(password)){
config.setPassword(password);
}
if (StringUtils.isNotBlank(driver)){
config.setDriverClassName(driver);
}
if (StringUtils.isNotBlank(minimumIdle)){
config.setMinimumIdle(Integer.parseInt(minimumIdle));
}
if (StringUtils.isNotBlank(maximumPoolSize)) {
config.setMaximumPoolSize(Integer.parseInt(maximumPoolSize));
}
if (StringUtils.isNotBlank(autoCommit)) {
config.setAutoCommit(Boolean.parseBoolean(autoCommit));
}
if (StringUtils.isNotBlank(idleTimeout)) {
config.setIdleTimeout(Integer.parseInt(idleTimeout));
}
if (StringUtils.isNotBlank(poolName)){
config.setPoolName(poolName);
}
if (StringUtils.isNotBlank(maxLifetime)) {
config.setMaxLifetime(Integer.parseInt(maxLifetime));
}
if (StringUtils.isNotBlank(connectionTimeout)) {
config.setConnectionTimeout(Integer.parseInt(connectionTimeout));
}
return config;
}
}
3.关键配置.yml
mysql2:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/kaa_pro?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
username: root
password: 123123
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimumIdle: 10
maximumPoolSize: 50
autoCommit: true
idleTimeout: 30000
poolName: DatebookHikariCP1
maxLifetime: 1800000
connectionTimeout: 30000
测试结果:
特此分享记录。