Как Spring Boot осведомлен о конфигурации DATABASE_URL от Heroku? - PullRequest
0 голосов
/ 30 ноября 2018

Короткая история:

Как именно Spring Boot анализирует конфигурационную переменную DATABASE_URL?Установка свойства среды с тем же именем на моем локальном ПК не имеет никакого эффекта.Какие классы в библиотеке Spring Boot задействованы?Полнотекстовый поиск по DATABASE_URL ничего не возвращает.

Длинная история:

Я недавно развернул простое приложение Spring Boot + JPA в Heroku.Моя герока уже была настроена с помощью дополнения Postgres.

Во время моего первого развертывания я только хотел подтвердить, что приложение собирается и правильно запускается.К моему удивлению, приложение сразу подключилось к базе данных Postgres, настроенной в DATABASE_URL config var Heroku:

2018-11-30T09:28:51.054688+00:00 app[web.1]: 2018-11-30 09:28:51.054  INFO 4 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL95Dialect

. Это приводит меня к вопросам, уже опубликованным выше.

Я используюSpring boot 2.1.0., простое приложение , созданное Spring Initializr , с Web + JPA + H2 + PostgreSQL.H2 включен, потому что:

  • Я хочу запускать модульные тесты со встроенной H2
  • , я хочу запускать свое приложение локально со встроенной H2, но иногда,Я хочу переключиться на Postgres от Heroku, чтобы я мог проверить некоторые специфичные для БД вещи (например, миграции)

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Весна не знает о DATABASE_URL (насколько я знаю).Но он обнаруживает и автоматически использует SPRING_DATASOURCE_URL, который устанавливает пакет сборки Heroku Java во время выполнения.

Подробнее об этом env var можно прочитать в документации Heroku по Подключение к реляционным базам данных в Heroku с Java

0 голосов
/ 09 января 2019

Я отвечу на свой вопрос, чтобы дополнить принятый ответ более подробной информацией о свойствах среды, установленных Heroku.

Предполагая, что ваше приложение Heroku содержит переменную среды:

  • DATABASE_URL = postgres://username:password@host:port/database

Heroku автоматически предоставит следующие переменные среды (которые можно использовать, например, в своем любимом клиенте SQL на основе JDBC):

  • JDBC_DATABASE_URL= jdbc:postgresql://host:port/database?user=username&password=password&sslmode=require
  • JDBC_DATABASE_USERNAME = username
  • JDBC_DATABASE_PASSWORD = password

И, кроме того, те, которые были выбраны Spring Bootавтоматически (который можно использовать для изменения локального загрузочного профиля Spring:

  • SPRING_DATASOURCE_USERNAME = аналогично JDBC_DATABASE_USERNAME
  • SPRING_DATASOURCE_PASSWORD = аналогично JDBC_DATABASE_PASSWORD
  • SPRING_DATASOURCE_URL = то же, что и JDBC_DATABASE_URL

Я наблюдал это, используя простую конечную точку REST:

@RequestMapping("/env")
public @ResponseBody Map<String, String> env() {
    return System.getenv();
}

Будьте осторожны, чтобы не совершить ту же ошибкукак я делал: DATABASE_URL начинается с postgres, а префикс JDBC для Postgres - postgresql. Использование SPRING_DATASOURCE_URL с префиксом jdbc:postgres:// приведетна следующую ошибку:

Драйвер org.h2.Driver утверждает, что не принимает jdbcUrl, jdbc: postgres: //....

0 голосов
/ 30 ноября 2018

Чтобы можно было легко переключаться между h2 и heroku, можно иметь 2 файла конфигурации

Файлы свойств h2 с именем application-h2.properties :

spring.profiles.active=h2
spring.datasource.url= # H2 URL of the database.
spring.datasource.driver-class-name=# H2 JDBC driver. Auto-detected based on the URL by default.
spring.datasource.password= # Login password of the database.
spring.datasource.username= # Login username of the database.

Активируется включением профиля h2 при запуске приложения весенней загрузки:

java -jar -Dspring.profiles.active=h2 myApplication.jar

Файлы свойств heroku с именем application-heroku.properties :

spring.profiles.active=heroku
spring.datasource.url= # herokuURL of the database.
spring.datasource.driver-class-name=# herokuJDBC driver. Auto-detected based on the URL by default.
spring.datasource.password= # Login password of the database.
spring.datasource.username= # Login username of the database.

Активируется путем включения профиля heroku при запуске приложения весенней загрузки:

java -jar -Dspring.profiles.active=heroku myApplication.jar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...