Мультиарендность в Spring Boot

У меня возникают проблемы с созданием приложения весенней загрузки, которое может динамически подключаться к нескольким базам данных, в зависимости от ввода пользователя. В основном приложение выполняет один и тот же sql-запрос в разных базах данных. моделируя мою попытку после это, я получил следующую ошибку:

2018-04-10 16:18:50.678 ERROR 15716 --- [  restartedMain] com.zaxxer.hikari.HikariConfig           : HikariPool-1 - dataSource or dataSourceClassName or jdbcUrl is required.

-

Caused by: java.lang.IllegalArgumentException: dataSource or  dataSourceClassName or jdbcUrl is required.

класс конфигурации:

@Configuration
public class ReconDBConfig {


@ConfigurationProperties(prefix = "spring.datasource.foo")
@Bean
@Primary
public DataSource fooDataSource() {
    return DataSourceBuilder
            .create()
            .build();
}

@ConfigurationProperties(prefix = "spring.datasource.bar")
@Bean
public DataSource barDataSource() {
    return DataSourceBuilder
            .create()
            .build();
}
}

Файл свойств:

spring.datasource.foo.url        =     jdbc:postgresql://localhost:5432/fooDB
spring.datasource.foo.user       =  admin
spring.datasource.foo.password   =  admin
spring.datasource.foo.driver     =  org.postgresql.Driver
spring.datasource.foo.maxconn    =  5
spring.datasource.foo.expiry     =  180
spring.datasource.foo.cache      =  true
spring.datasource.foo.retry      =  3
spring.datasource.foo.retrydelay =  30

spring.datasource.bar.url        =     jdbc:postgresql://not_localhost:5432/fooDB
spring.datasource.bar.user       =  definitely_not_admin
spring.datasource.bar.password   =  definitely_not_admin
spring.datasource.bar.driver     =  org.postgresql.Driver
spring.datasource.bar.maxconn    =  5
spring.datasource.bar.expiry     =  180
spring.datasource.bar.cache      =  true
spring.datasource.bar.retry      =  3
spring.datasource.bar.retrydelay =  30

есть идеи о том, как я могу это сделать? Я, как вы можете сказать, еще не очень разбираюсь в этой конфигурации с несколькими базами данных.

Эта ошибка появляется при каждой попытке или сразу после успешного первого подключения?

Matheus Mohr 11.04.2018 00:33

каждый раз, ну, я только пытался построить проект менее 10 раз ... но каждый раз ..

StillLearningToCode 11.04.2018 00:35

Закомментируйте один из bean-компонентов и посмотрите, получите ли вы ту же ошибку. Имея два, исключение не сообщает вам, какой из них вызывает проблему.

efekctive 11.04.2018 00:40

что было сделано, та же ошибка. я уверен, что это как-то связано с «dataSource или dataSourceClassName или jdbcUrl требуется», но я не уверен, как добавить это в

StillLearningToCode 11.04.2018 00:42

Вы пробовали настроить его, как указано здесь?

Matheus Mohr 11.04.2018 00:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
1 185
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

DataSourceBuilder.create().build() будет создавать экземпляр HikariDataSource, поскольку он является источником данных по умолчанию, начиная с SpringBoot 2.0. Если вы посмотрите исходный код HikariDataSource, свойства: jdbcUrl, имя пользователя НЕ url, Пользователь. Итак, вам нужно изменить ключи свойств в файле application.properties следующим образом:

spring.datasource.foo.jdbcUrl=jdbc:postgresql://localhost:5432/fooDB
spring.datasource.foo.username=admin
...
...
spring.datasource.bar.jdbcUrl=jdbc:postgresql://not_localhost:5432/fooDB
spring.datasource.bar.username=definitely_not_admin
...
...

Чтобы использовать другой источник данных на основе некоторых параметров запроса, вам, возможно, придется использовать Spring AbstractRoutingDataSource, как описано здесь https://spring.io/blog/2007/01/23/dynamic-datasource-routing/.

Другие вопросы по теме