Использование двух источников данных с разными драйверами jdb c в Spring Boot - PullRequest
1 голос
/ 15 апреля 2020

Я следовал документации и создал некоторый исходный код, который совершенно идентичен приведенному примеру. Когда я запускаю свой код, я получаю это исключение:

java .lang.RuntimeException: драйвер org.mariadb.jdb c .Driver утверждает, что не принимает jdbcUrl, jdb c: h2 : mem: testdb; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE

Странно то, что две вещи смешаны:

  • h2-jdbcUrl обрабатывается mariaDB -driver
  • запрос, который мой ранее существующий код выполняет, нацелен на 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;
    }

Для дальнейшей диагностики я включил конечные точки configprops и beans и проверили их вывод. Конфиг выглядит хорошо, и бины тоже:

Конфиг (один из многих):

    "firstDataSourceProperties": {
      "prefix": "datasources.first",
      "properties": {
        "password": "******",
        "initializationMode": "EMBEDDED",
        "driverClassName": "org.mariadb.jdbc.Driver",
        "generateUniqueName": false,
        "xa": {
          "properties": {}
        },
        "separator": ";",
        "platform": "all",
        "continueOnError": false,
        "username": "..."
      }

Бин (один из многих):

"firstDataSource": {
          "aliases": [],
          "scope": "singleton",
          "type": "com.zaxxer.hikari.HikariDataSource",
          "resource": "...Application",
          "dependencies": [
            "firstDataSourceProperties"
          ]
        }

Я использую Spring Ботинок 2.2.6

1 Ответ

0 голосов
/ 15 апреля 2020

Эта проблема была вызвана тем, что я не понимал взаимодействие между 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. Это вызвано тем фактом, что я установил «мой» целевой URL на datasources.first.jdbcUrl. Но после этого было прочитано (несуществующее) значение datasources.first.configuration.jdbcUrl, которое не было сконфигурировано и явно установлено по умолчанию.

После того, как я изменил свой application.yml на это, оно заработало:

datasources:
  first:
    username: ...
    password: ...
    driver-class-name: org.mariadb.jdbc.Driver
    configuration:
      jdbcUrl: jdbc:mariadb://...

Мне нужно будет решить, какое значение куда поместить, username и password тоже можно переместить на один уровень глубже, но это уже другая история ...

...