Dynamic-datasource加载报错:jdbcUrl is required with driverClassName

it2025-09-07  8

问题描述

在给项目配置动态数据源时使用的时

<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的错误。

最新回复(0)