在Spring Boot中使用具有不同jdbc驱动程序的两个数据源

问题描述 投票:1回答:1

我跟随documentation,并创建了一些与给定示例完全相同的源代码。当我运行代码时,出现此异常:

java.lang.RuntimeException:驱动程序org.mariadb.jdbc.Driver声称不接受jdbcUrl,jdbc:h2:mem:testdb; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE

奇怪的是,两件事混合在一起:

  • h2-jdbcUrl由mariaDB驱动程序处理
  • 我先前存在的代码运行它的查询针对的是mariaDB(我尚未编写任何使用第二个数据源的代码)

这些是我的豆子:

@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;
    }

为了进一步诊断,我启用了configpropsbeans端点并检查了它们的输出。配置看起来不错,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

java spring spring-boot spring-jdbc
1个回答
0
投票

此问题是由于我不了解DataSourcePropertiesHikariDataSource之间的交互作用。

[我发现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://...

[我将需要决定将哪个值放在哪里,usernamepassword也可以移得更深,但这是另一回事了……

© www.soinside.com 2019 - 2024. All rights reserved.