Как создать источник данных БД, используя параметризованный пользовательский класс драйвера?

#java #spring #postgresql #spring-boot #spring-data-jpa

#java #весна #postgresql #spring-boot #spring-data-jpa

Вопрос:

В приложении Spring Boot я подключаюсь к базе данных Postgres. Для конкретного требования мне нужно использовать параметризованный класс драйверов, который является подклассом org.postgresql.Driver .

Как я могу создать DataSource объект, используя параметризованный класс драйвера?

 DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("com.apps.CustomPostgresqlDriver") // Not sure how to pass a string argument to its constructor
.build()
  

Драйвер клиента com.apps.CustomPostgresqlDriver определяется следующим образом.

 Public class CustomPostgresqlDriver implements Driver {

   public void CustomPostgresqlDriver(String appParam){

      ....
   }
...

}
  

Я не вижу никакой возможности создать экземпляр (или позволить Spring создать экземпляр) драйвера с помощью вышеупомянутого конструктора с одним аргументом. Пример:

new CustomPostgresqlDriver("my-app-db-param")

Комментарии:

1. Неправильный подход. Вы передаете свойства драйверу через «свойства подключения», которые указаны как часть URL-адреса JDBC.

2. Привет @Andreas, спасибо за ваш ответ. Я добавил еще несколько разъяснений в qts. Есть ли у вас какой-либо пример / ссылка на предложенный вами подход?

3. Вы имеете в виду что-то вроде документации по драйверу PostgreSQL JDBC , показывающей свойства, которые можно добавить к URL?

4. Нет. Если мы просто упомянем dataSourceBuilder.driverClassName("com.apps.CustomPostgresqlDriver") , то spring создаст экземпляр объекта CustomPostgresqlDriver . правильно? Я хочу передать строковый параметр конструктору класса (CustomPostgresqlDriver). Я считаю, что должен быть какой-то способ получить дескриптор этой конструкции или позволить spring создать экземпляр (который Spring выполняет, используя отражение, я думаю), минуя строковый параметр для него.

5. Почему это обязательно должен быть конструктор? Почему это не может быть connect() методом Driver ? Вы знаете, метод, который получает URL-адрес JDBC и Properties объект со всеми приятными свойствами. Вы знаете, свойства, которые вы можете указать рядом с именем класса драйвера. Перестаньте так зацикливаться на конструкторе. Это проблема XY .

Ответ №1:

Вы можете использовать DataSourceBuilder для завершения этой задачи: первая настройка двух разных настроек ds в приложении.yml, как показано ниже:

 spring:
  datasource:
    main: 
      driver-class-name: ${ds.driver}
      url: ${ds.url}
      username: ${ds.username}
      password: ${ds.password}
      hikari:
        maximum-pool-size: ${ds.maximum.pool.size}
        minimum-idle: ${ds.minimum.idle}
        connection-timeout: 10000
        connection-test-query: SELECT 1
    read:
      driver-class-name: ${ds.driver}
      url: ${ds.read.url}
      username: ${ds.read.username}
      password: ${ds.read.password}
      hikari:
        maximum-pool-size: ${ds.read.maximum.pool.size}
        minimum-idle: ${ds.read.minimum.idle}
        connection-timeout: 10000
        connection-test-query: SELECT 1
  

Второй вводит их с помощью DataSourceBuilder, как показано ниже:

 
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;

    @Primary
    @Bean
    @ConfigurationProperties("spring.datasource.main")
    public DataSource main() {
        return DataSourceBuilder.create().build();
    }
 
 
    @Bean
    @ConfigurationProperties("spring.datasource.read")
    public DataSource read() {
        return DataSourceBuilder.create().build();
    }
  

Комментарии:

1. Спасибо за ваш ответ. В этом случае я не создаю два источника данных. Мне нужно передать параметр конструктору моего пользовательского драйвера БД, т.Е.. com.apps.CustomPostgresqlDriver. обновлен qts с помощью высокоуровневого определения этого.

2. Если вы расширите DataSourceBuilder, и вы поймете, чего хотите. Пожалуйста, посмотрите его исходный код. Драйвер будет передан как параметр вашему новому DataSourceBuilder.

3. В моем примере просто показан способ передачи драйвера через yaml. Если вам нравится program, возможно, это хороший способ расширить DataSourceBuilder.