#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.