Enklaste och renaste sättet för Spring Boot 2.x med Heroku &Postgres
Jag läste alla svar, men hittade inte vad Jonik letade efter:
Jag letar efter det enklaste, renaste sättet att ansluta till HerokuPostgres i en Spring Boot-app med JPA/Hibernate
Utvecklingsprocessen de flesta vill använda med Spring Boot &Heroku inkluderar en lokal H2-minnesdatabas för testning och snabba utvecklingscykler - och Heroku Postgres-databasen för iscensättning och produktion på Heroku.
- För det första är - du behöver inte använda Spring-profiler för det!
- Andra:Du behöver inte skriva/ändra någon kod!
Låt oss ta en titt på vad vi måste göra steg för steg. Jag har ett exempelprojekt på plats som ger en fullt fungerande Heroku-distribution och konfiguration för Postgres - bara för fullständighetens skull, om du vill testa det själv:github.com/jonashackt/spring-boot-vuejs.
Pom.xml
Vi behöver följande beroenden:
<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>
En knepig sak här är användningen av tomcat-jdbc
, men vi tar upp det på en sekund.
Konfigurera miljövariabler på Heroku
I Heroku-miljön heter variabler Config Vars
. Du hörde rätt, allt vi behöver göra är att konfigurera miljövariabler! Vi behöver bara de rätta. Gå därför över till https://data.heroku.com/ (jag antar att det redan finns en Postgres-databas konfigurerad för din Heroku-app, vilket är standardbeteendet).
Klicka nu på din applikations motsvarande Datastore
och växla över till Settings
flik. Klicka sedan på View Credentials...
, som borde se ut ungefär så här:
Öppna nu en ny webbläsarflik och gå till din Heroku-applikations Settings
fliken också. Klicka på Reveal Config Vars
och skapa följande miljövariabler:
SPRING_DATASOURCE_URL
=jdbc :postgresql ://YourPostgresHerokuHostNameHere :5432/YourPostgresHerokuDatabaseNameHere (tänk på den inledandejdbc:
ochql
tillägg tillpostgres
!)SPRING_DATASOURCE_USERNAME
=YourPostgresHerokuUserNameHereSPRING_DATASOURCE_PASSWORD
=YourPostgresHerokuPasswordHereSPRING_DATASOURCE_DRIVER-CLASS-NAME
=org.postgresql.Driver
(detta behövs inte alltid eftersom Spring Boot kan härleda det för de flesta databaser från webbadressen, bara för fullständighetens skull här)SPRING_JPA_DATABASE-PLATFORM
=org.hibernate.dialect.PostgreSQLDialect
SPRING_DATASOURCE_TYPE
=org.apache.tomcat.jdbc.pool.DataSource
SPRING_JPA_HIBERNATE_DDL-AUTO
=update
(detta skapar automatiskt dina tabeller enligt dina JPA-entiteter, vilket är riktigt bra - eftersom du inte behöver hindra dig medCREATE
SQL-satser eller DDL-filer)
I Heroku bör detta se ut så här:
Nu är det allt du behöver göra! Din Heroku-app startas om varje gång du ändrar en konfigurationsvariabel - så din app bör nu köra H2 lokalt och bör vara klar med PostgreSQL när den distribueras på Heroku.
Bara om du frågar:Varför konfigurerar vi Tomcat JDBC istället för Hikari
Som du kanske märkte lade vi till tomcat-jdbc
beroende av vår pom.xml och konfigurerade SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource
som en miljövariabel. Det finns bara en liten antydan i dokumenten om detta talesätt
Du kan kringgå den algoritmen helt och ange vilken anslutningspool som ska användas genom att ställa in egenskapen spring.datasource.type. Detta är särskilt viktigt om du kör din applikation i en Tomcat-behållare, ...
Det finns flera anledningar till att jag bytte tillbaka till Tomcat-pooling av DataSource istället för att använda Spring Boot 2.x-standarden HikariCP. Som jag redan förklarat här, om du inte anger spring.datasource.url
, Spring kommer att försöka koppla den inbäddade im-memory H2-databasen automatiskt istället för vår PostgreSQL. Och problemet med Hikari är att den bara stöder spring.datasource.jdbc-url
.
För det andra, om jag försöker använda Heroku-konfigurationen som visas för Hikari (så att SPRING_DATASOURCE_TYPE
utelämnas och ändra SPRING_DATASOURCE_URL
till SPRING_DATASOURCE_JDBC-URL
) Jag stöter på följande undantag:
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
Så jag fick inte Spring Boot 2.x att arbeta på Heroku &Postgres med HikariCP, utan med Tomcat JDBC - och jag vill inte heller bromsa min utvecklingsprocess som innehåller en lokal H2-databas som beskrivs i förväg. Kom ihåg:Vi letade efter det enklaste, renaste sättet att ansluta till Heroku Postgres i en Spring Boot-app med JPA/Hibernate!