我跟随documentation,并创建了一些与给定示例完全相同的源代码。当我运行代码时,出现此异常:
java.lang.RuntimeException:驱动程序org.mariadb.jdbc.Driver声称不接受jdbcUrl,jdbc:h2:mem:testdb; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE
奇怪的是,两件事混合在一起:
这些是我的豆子:
@Bean
@Primary
@ConfigurationProperties("datasources.first")
public DataSourceProperties firstDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("datasources.first.configuration")
public HikariDataSource firstDataSource() {
return firstDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
@Bean
@ConfigurationProperties("datasources.second")
public DataSourceProperties secondDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("datasources.second.configuration")
public HikariDataSource secondDataSource() {
return secondDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
我的application.yml看起来像这样:
datasources:
first:
jdbcUrl: jdbc:mariadb://...
username: ...
password: ...
driver-class-name: org.mariadb.jdbc.Driver
second:
jdbcUrl: jdbc:h2:/tmp/test;DB_CLOSE_ON_EXIT=FALSE
username: ...
password: ...
driver-class-name: org.h2.Driver
这是导致异常的代码:
@Component
public class Updater {
@Autowired
JdbcTemplate jdbcTemplate;
@Autowired
Queries queries;
public List<User> getActiveUsers() throws Exception {
List<User> users = jdbcTemplate.query(queries.getActive(), new UserRowMapper());
return users;
}
为了进一步诊断,我启用了configprops
和beans
端点并检查了它们的输出。配置看起来不错,bean也是如此:
配置(许多):
"firstDataSourceProperties": {
"prefix": "datasources.first",
"properties": {
"password": "******",
"initializationMode": "EMBEDDED",
"driverClassName": "org.mariadb.jdbc.Driver",
"generateUniqueName": false,
"xa": {
"properties": {}
},
"separator": ";",
"platform": "all",
"continueOnError": false,
"username": "..."
}
Bean(很多):
"firstDataSource": {
"aliases": [],
"scope": "singleton",
"type": "com.zaxxer.hikari.HikariDataSource",
"resource": "...Application",
"dependencies": [
"firstDataSourceProperties"
]
}
我使用Spring Boot 2.2.6
此问题是由于我不了解DataSourceProperties
和HikariDataSource
之间的交互作用。
[我发现jdbcUrl
没有携带我配置的值,这可以通过firstDataSource
的详细信息看到:
"firstDataSource": {
"prefix": "datasources.first.configuration",
"properties": {
"initializationFailTimeout": 1,
"validationTimeout": 5000,
"readOnly": false,
"registerMbeans": false,
"healthCheckProperties": {},
"isolateInternalQueries": false,
"leakDetectionThreshold": 0,
"maxLifetime": 1800000,
"minimumIdle": 10,
"metricsTrackerFactory": {},
"allowPoolSuspension": false,
"idleTimeout": 600000,
"dataSourceProperties": {},
"driverClassName": "org.mariadb.jdbc.Driver",
"jdbcUrl": "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE",
"loginTimeout": 0,
"maximumPoolSize": 10,
"autoCommit": true,
"connectionTimeout": 30000,
"username": "...",
"poolName": "HikariPool-1"
}
您可以看到jdbcUrl
地址h2。这是由于我在datasources.first.jdbcUrl
中设置了“我的”预期URL。但是之后,读取了datasources.first.configuration.jdbcUrl
的(不存在)值,该值未配置,并且显然设置为默认值。
在我将application.yml更改为它之后,它起作用了:
datasources:
first:
username: ...
password: ...
driver-class-name: org.mariadb.jdbc.Driver
configuration:
jdbcUrl: jdbc:mariadb://...
[我将需要决定将哪个值放在哪里,username
和password
也可以移得更深,但这是另一回事了……