Най-простият най-чист начин за Spring Boot 2.x с Heroku &Postgres
Прочетох всички отговори, но не намерих това, което Йоник търсеше:
Търся най-простия и чист начин за свързване с HerokuPostgres в приложение за Spring Boot с помощта на JPA/Hibernate
Процесът на разработка, който повечето хора искат да използват с Spring Boot &Heroku, включва локална база данни H2 в паметта за тестване и бързи цикли на разработка - и базата данни Heroku Postgres за поставяне и производство на Heroku.
- Първото нещо е – не е нужно да използвате Spring профили за това!
- Второ:Не е нужно да пишете/променяте код!
Нека да разгледаме какво трябва да направим стъпка по стъпка. Имам примерен проект, който осигурява напълно работещо разгръщане и конфигурация на Heroku за Postgres – само за пълнота, ако искате да го тествате сами:github.com/jonashackt/spring-boot-vuejs.
Pom.xml
Нуждаем се от следните зависимости:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- In-Memory database used for local development & testing -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<!-- Switch back from Spring Boot 2.x standard HikariCP to Tomcat JDBC,
configured later in Heroku (see https://stackoverflow.com/a/49970142/4964553) -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</dependency>
<!-- PostgreSQL used in Staging and Production environment, e.g. on Heroku -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.2</version>
</dependency>
Едно сложно нещо тук е използването на tomcat-jdbc
, но ще покрием това след секунда.
Конфигуриране на променливи на средата на Heroku
В Heroku променливите на средата са наречени Config Vars
. Чухте правилно, всичко, което трябва да направим, е да конфигурираме променливите на средата! Трябват ни само правилните. Затова отидете на https://data.heroku.com/ (предполагам, че вече има Postgres база данни, конфигурирана за вашето приложение Heroku, което е поведението по подразбиране).
Сега щракнете върху съответното Datastore
на вашето приложение и преминете към Settings
раздел. След това щракнете върху View Credentials...
, което трябва да изглежда нещо подобно:
Сега отворете нов раздел на браузъра и отидете на Settings
на вашето приложение Heroku раздел също. Щракнете върху Reveal Config Vars
и създайте следните променливи на средата:
SPRING_DATASOURCE_URL
=jdbc :postgresql ://YourPostgresHerokuHostNameТук :5432/YourPostgresHerokuDatabaseNameТук (имайте предвид водещияjdbc:
иql
допълнение къмpostgres
!)SPRING_DATASOURCE_USERNAME
=YourPostgresHerokuUserNameHereSPRING_DATASOURCE_PASSWORD
=YourPostgresHerokuPassword ТукSPRING_DATASOURCE_DRIVER-CLASS-NAME
=org.postgresql.Driver
(това не винаги е необходимо, тъй като Spring Boot може да го изведе за повечето бази данни от URL адреса, само за пълнота тук)SPRING_JPA_DATABASE-PLATFORM
=org.hibernate.dialect.PostgreSQLDialect
SPRING_DATASOURCE_TYPE
=org.apache.tomcat.jdbc.pool.DataSource
SPRING_JPA_HIBERNATE_DDL-AUTO
=update
(това автоматично ще създаде вашите таблици според вашите JPA обекти, което е наистина страхотно - тъй като не е нужно да препятствате сCREATE
SQL изрази или DDL файлове)
В Heroku това трябва да изглежда така:
Сега това е всичко, което трябва да направите! Вашето приложение Heroku се рестартира всеки път, когато промените конфигурационна променлива – така че приложението ви вече трябва да работи H2 локално и трябва да е готово да се свърже с PostgreSQL, когато се внедри на Heroku.
Само ако питате:Защо конфигурираме Tomcat JDBC вместо Hikari
Както може би сте забелязали, добавихме tomcat-jdbc
зависимост от нашия pom.xml и конфигуриран SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource
като променлива на околната среда. В документите има само лек намек за тази поговорка
Можете да заобиколите този алгоритъм напълно и да посочите пула за връзки, който да използвате, като зададете свойството spring.datasource.type. Това е особено важно, ако стартирате приложението си в контейнер Tomcat, ...
Има няколко причини да се върна към Tomcat обединяващ DataSource вместо да използвам стандартния HikariCP Spring Boot 2.x. Както вече обясних тук, ако не посочите spring.datasource.url
, Spring ще се опита да свърже автоматично вградената база данни с im-memory H2 вместо нашата PostgreSQL. И проблемът с Hikari е, че поддържа само spring.datasource.jdbc-url
.
Второ, ако се опитам да използвам конфигурацията на Heroku, както е показано за Hikari (така че пропускам SPRING_DATASOURCE_TYPE
и промяна на SPRING_DATASOURCE_URL
към SPRING_DATASOURCE_JDBC-URL
) Сблъсквам се със следното изключение:
Caused by: java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
Така че не накарах Spring Boot 2.x да работи върху Heroku &Postgres с HikariCP, а с Tomcat JDBC - и също така не искам да спирам процеса на разработка, съдържащ локална база данни H2, описана предварително. Запомнете:търсихме най-простия и чист начин за свързване с Heroku Postgres в приложение Spring Boot с помощта на JPA/Hibernate!