Nejjednodušší nejčistší způsob pro Spring Boot 2.x s Heroku &Postgres
Přečetl jsem všechny odpovědi, ale nenašel jsem, co Jonik hledal:
Hledám nejjednodušší a nejčistší způsob připojení k HerokuPostgres v aplikaci Spring Boot pomocí JPA/Hibernate
Vývojový proces, který chce většina lidí používat se Spring Boot &Heroku, zahrnuje lokální H2 in-memory databázi pro testování a rychlé vývojové cykly – a databázi Heroku Postgres pro staging a produkci na Heroku.
- První věc je – k tomu nepotřebujete používat profily Spring!
- Za druhé:Nemusíte psát/měnit žádný kód!
Pojďme se podívat na to, co musíme udělat krok za krokem. Mám příklad projektu, který poskytuje plně funkční nasazení a konfiguraci Heroku pro Postgres – pouze pro úplnost, pokud si to chcete sami vyzkoušet:github.com/jonashackt/spring-boot-vuejs.
Pom.xml
Potřebujeme následující závislosti:
<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>
Jedna ošemetná věc je zde použití tomcat-jdbc
, ale to probereme za sekundu.
Konfigurace proměnných prostředí na Heroku
V Heroku se proměnné prostředí jmenují Config Vars
. Slyšeli jste dobře, vše, co musíme udělat, je nakonfigurovat proměnné prostředí! Potřebujeme jen ty správné. Přejděte proto na https://data.heroku.com/ (předpokládám, že již existuje databáze Postgres nakonfigurovaná pro vaši aplikaci Heroku, což je výchozí chování).
Nyní klikněte na odpovídající Datastore
vaší aplikace a přepněte do Settings
tab. Poté klikněte na View Credentials...
, který by měl vypadat nějak podobně:
Nyní otevřete novou kartu prohlížeče a přejděte do Settings
vaší aplikace Heroku karta také. Klikněte na Reveal Config Vars
a vytvořte následující proměnné prostředí:
SPRING_DATASOURCE_URL
=jdbc :postgresql ://YourPostgresHerokuHostNameHere :5432/YourPostgresHerokuDatabaseNameHere (pamatujte na úvodníjdbc:
aql
přidání dopostgres
!)SPRING_DATASOURCE_USERNAME
=YourPostgresHerokuUserNameHereSPRING_DATASOURCE_PASSWORD
=YourPostgresHerokuPasswordHereSPRING_DATASOURCE_DRIVER-CLASS-NAME
=org.postgresql.Driver
(toto není vždy potřeba, protože Spring Boot to dokáže odvodit pro většinu databází z adresy URL, jen pro úplnost zde)SPRING_JPA_DATABASE-PLATFORM
=org.hibernate.dialect.PostgreSQLDialect
SPRING_DATASOURCE_TYPE
=org.apache.tomcat.jdbc.pool.DataSource
SPRING_JPA_HIBERNATE_DDL-AUTO
=update
(toto automaticky vytvoří vaše tabulky podle vašich JPA entit, což je opravdu skvělé - protože se nemusíte trápit sCREATE
Příkazy SQL nebo soubory DDL)
V Heroku by to mělo vypadat takto:
To je vše, co musíte udělat! Vaše aplikace Heroku se restartuje pokaždé, když změníte konfigurační proměnnou – takže vaše aplikace by nyní měla běžet H2 lokálně a měla by být připravena propojená s PostgreSQL při nasazení na Heroku.
Jen když se ptáte:Proč konfigurujeme Tomcat JDBC místo Hikari
Jak jste si možná všimli, přidali jsme tomcat-jdbc
závislost na našem pom.xml a nakonfigurovaný SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource
jako proměnná prostředí. V dokumentech je o tomto rčení jen nepatrný náznak
Tento algoritmus můžete zcela obejít a určit fond připojení, který se má použít, nastavením vlastnosti spring.datasource.type. To je zvláště důležité, pokud aplikaci spouštíte v kontejneru Tomcat, ...
Existuje několik důvodů, proč jsem přešel zpět na Tomcat pooling DataSource namísto použití standardu Spring Boot 2.x HikariCP. Jak jsem zde již vysvětlil, pokud nezadáte spring.datasource.url
Spring se pokusí automaticky připojit vestavěnou databázi im-memory H2 namísto naší PostgreSQL. A problém s Hikari je, že podporuje pouze spring.datasource.jdbc-url
.
Za druhé, pokud se pokusím použít konfiguraci Heroku, jak je ukázáno pro Hikari (takže vynechám SPRING_DATASOURCE_TYPE
a změnou SPRING_DATASOURCE_URL
na SPRING_DATASOURCE_JDBC-URL
) Narazil jsem na následující výjimku:
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
Takže jsem nedostal Spring Boot 2.x pracující na Heroku &Postgres s HikariCP, ale s Tomcat JDBC - a také nechci brzdit můj vývojový proces obsahující lokální databázi H2 popsanou předem. Pamatujte:Hledali jsme nejjednodušší a nejčistší způsob připojení k Heroku Postgres v aplikaci Spring Boot pomocí JPA/Hibernate!