问题描述
在给项目配置动态数据源时使用的时
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>
使用的配置文件如下
spring:
datasource:
dynamic:
primary: center-bill
datasource:
master:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.127.127.1:3306/center_bill?characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
password: '*******'
username: dev_rw
maximumPoolSize: 10 # Default: 10
poolName: center-bill_master
slave0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.128.122.2:3306/center_bill?characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
password: '*********'
username: dev_rw
maximumPoolSize: 10 # Default: 10
poolName: center-bill_slave0
运行时代码报错:
Caused by: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
at com.zaxxer.hikari.HikariConfig.validate(HikariConfig.java:1000)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:77)
at com.baomidou.dynamic.datasource.creator.HikariDataSourceCreator.createDataSource(HikariDataSourceCreator.java:47)
at com.baomidou.dynamic.datasource.creator.DataSourceCreator.createHikariDataSource(DataSourceCreator.java:165)
at com.baomidou.dynamic.datasource.creator.DataSourceCreator.createDataSource(DataSourceCreator.java:95)
at com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider.createDataSourceMap(AbstractDataSourceProvider.java:45)
at com.heytea.service.order.admin.config.DynamicDataSourceConfig$1.loadDataSources(DynamicDataSourceConfig.java:41)
at com.baomidou.dynamic.datasource.DynamicRoutingDataSource.afterPropertiesSet(DynamicRoutingDataSource.java:254)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792)
... 181 common frames omitted
问题分析
这个问题看起来很明显,加载driverClassName时缺少jdbcUrl,但是我们的配置中的jdbcUrl明明有配置,这种情况只能是直接进源码看了,经过一番操作,找到了这个参数实在创建Hikari数据源时使用的类名:HikariDataSourceCreator
,加载时的代码为:
@Data
@AllArgsConstructor
public class HikariDataSourceCreator {
private HikariCpConfig hikariCpConfig;
public DataSource createDataSource(DataSourceProperty dataSourceProperty) {
HikariConfig config = dataSourceProperty.getHikari().toHikariConfig(hikariCpConfig);
config.setUsername(dataSourceProperty.getUsername());
config.setPassword(dataSourceProperty.getPassword());
config.setJdbcUrl(dataSourceProperty.getUrl());
config.setDriverClassName(dataSourceProperty.getDriverClassName());
config.setPoolName(dataSourceProperty.getPoolName());
return new HikariDataSource(config);
}
}
问题大家可能已经发现了,这里报错的原因就是这行代码
config.setJdbcUrl(dataSourceProperty.getUrl());
取的配置中的Url赋值给jdbcUrl,所以配置中应该配的是url而不是jdbc-url
问题处理
将配置中的jdbc-url改为url问题即可解决。
写在后面
dyncmic-datasource之前看到好像是不支持hikari连接池的,因为hikari连接池的url使用的是jdbc-url,但是dyncmic-datasource为了保持架构配置的统一,全部使用了url属性,但是这个数据源的加载是hikari完成的,所以配置有问题,报的错误就是jdbcUrl的错误。