Как я могу предоставить различные конфигурации баз данных с помощью Spring Boot?
Как я сейчас вижу, у меня есть 5 возможных профилей базы данных
- CI-тестирование → h2 mem
- среда разработчика (может быть выполнена проверка или приложение) → h2 mem, или h2 файл, или postgres
- production → postgres (в идеале учетные данные не хранятся в git/war)
В настоящее время у меня есть postgres, настроенный для запуска приложения, и h2 настроен для тестирования с помощью другого application.properties
в java/resource
vs test/resources
какой самый простой способ изменить информацию о подключении к базе данных для этих сценариев?
Ответы
Ответ 1
Как отмечает М. Деййн в своем комментарии, самый простой способ сделать это - использовать конфигурацию, специфичную для профиля.
Spring Загрузка позволяет иметь один общий файл конфигурации (application.properties
), а затем несколько других файлов, каждый из которых относится к профилю (application-${profile}.properties
).
Например:
-
application.properties
- Общая конфигурация
-
application-dev.properties
- Конфигурация для профиля dev
-
application-ci.properties
- Конфигурация для профилей ci
Если ваше приложение работает с профилем "ci", например, будет загружен файл конфигурации по умолчанию, а также файл конфигурации ci (который будет содержать свойства конфигурации источника данных для профиля ci).
Для переключения профилей вы можете использовать один из следующих вариантов:
- Свойство JVM:
-Dspring.profiles.active=ci
- Переключатель командной строки:
--spring.profiles.active=dev
Для модульных тестов вы можете использовать аннотацию @ActiveProfiles("test")
на ваших тестовых классах, чтобы сообщить Spring, что модульные тесты должны запускаться с тестовым профилем.
Кроме того, если вы не хотите хранить учетные данные производственной базы данных вместе с исходным кодом, вы можете указать внешний файл конфигурации при развертывании своего приложения в процессе производства:
- Использование командной строки:
--spring.config.location=/srv/myapp/config.properties
- Использование свойства JVM:
-Dspring.config.location=/srv/myapp/config.properties
Ответ 2
Компактный ответ для описанного выше сценария будет заключаться в создании одного файла application.yml и создании различных профилей на основе этого требования в вашем случае -dev, -ci и -prod и предоставления соответствующей информации БД.
Пример примера:
spring:
profiles.active: development
---
spring:
profiles: development
datasource:
db-person:
url: jdbc:oracle:thin:@db_person_dev
username: username
password: pwd
driver-class-name: oracle.jdbc.OracleDriver
test-on-borrow: true
validation-query: SELECT 1 FROM dual
db-contract:
url: jdbc:oracle:thin:@db_contract_dev
username: username
password: pwd
driver-class-name: oracle.jdbc.OracleDriver
test-on-borrow: true
validation-query: SELECT 1 FROM dual
---
spring:
profiles: test
datasource:
db-person:
url: jdbc:oracle:thin:@db_person_test
username: username
password: pwd
driver-class-name: oracle.jdbc.OracleDriver
test-on-borrow: true
validation-query: SELECT 1 FROM dual
db-contract:
url: jdbc:oracle:thin:@db_contract_test
username: username
password: pwd
driver-class-name: oracle.jdbc.OracleDriver
test-on-borrow: true
validation-query: SELECT 1 FROM dual
---
spring:
profiles: production
datasource:
db-person:
url: jdbc:oracle:thin:@db_person_prod
username: username
password: pwd
driver-class-name: oracle.jdbc.OracleDriver
test-on-borrow: true
validation-query: SELECT 1 FROM dual
db-contract:
url: jdbc:oracle:thin:@db_contract_prod
username: username
password: pwd
driver-class-name: oracle.jdbc.OracleDriver
test-on-borrow: true
validation-query: SELECT 1 FROM dual
---
Для дальнейшего понимания и простого примера вы можете ссылаться на эту ссылку .