Den enkleste, reneste måde for Spring Boot 2.x med Heroku &Postgres
Jeg læste alle svar, men fandt ikke, hvad Jonik ledte efter:
Jeg leder efter den enkleste, reneste måde at oprette forbindelse til HerokuPostgres i en Spring Boot-app ved hjælp af JPA/Hibernate
Den udviklingsproces, de fleste ønsker at bruge med Spring Boot &Heroku, inkluderer en lokal H2-in-memory-database til test og hurtige udviklingscyklusser - og Heroku Postgres-databasen til iscenesættelse og produktion på Heroku.
- Det første er - du behøver ikke bruge Spring-profiler til det!
- For det andet:Du behøver ikke at skrive/ændre nogen kode!
Lad os se på, hvad vi skal gøre trin for trin. Jeg har et eksempelprojekt på plads, der giver en fuldt fungerende Heroku-implementering og -konfiguration til Postgres - kun for fuldstændighedens skyld, hvis du selv vil teste det:github.com/jonashackt/spring-boot-vuejs.
Pom.xml
Vi har brug for følgende afhængigheder:
<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 vanskelig ting her er brugen af tomcat-jdbc
, men vi dækker det om et øjeblik.
Konfigurer miljøvariabler på Heroku
I Heroku-miljøet hedder variabler Config Vars
. Du hørte rigtigt, alt hvad vi skal gøre er at konfigurere miljøvariabler! Vi mangler bare de rigtige. Gå derfor over til https://data.heroku.com/ (jeg antager, at der allerede er en Postgres-database konfigureret til din Heroku-app, hvilket er standardadfærden).
Klik nu på din applikations tilsvarende Datastore
og skift til Settings
fanen. Klik derefter på View Credentials...
, som skulle se noget lignende ud:
Åbn nu en ny browserfane og gå til din Heroku-applikations Settings
fane også. Klik på Reveal Config Vars
og opret følgende miljøvariabler:
SPRING_DATASOURCE_URL
=jdbc :postgresql ://YourPostgresHerokuHostNameHere :5432/YourPostgresHerokuDatabaseNameHere (husk på den førendejdbc:
ogql
tilføjelse tilpostgres
!)SPRING_DATASOURCE_USERNAME
=YourPostgresHerokuUserNameHereSPRING_DATASOURCE_PASSWORD
=YourPostgresHerokuPasswordHereSPRING_DATASOURCE_DRIVER-CLASS-NAME
=org.postgresql.Driver
(dette er ikke altid nødvendigt, da Spring Boot kan udlede det for de fleste databaser fra url'en, bare for fuldstændighedens skyld her)SPRING_JPA_DATABASE-PLATFORM
=org.hibernate.dialect.PostgreSQLDialect
SPRING_DATASOURCE_TYPE
=org.apache.tomcat.jdbc.pool.DataSource
SPRING_JPA_HIBERNATE_DDL-AUTO
=update
(dette vil automatisk oprette dine tabeller i henhold til dine JPA-enheder, hvilket er rigtig godt - da du ikke behøver at hæmme medCREATE
SQL-sætninger eller DDL-filer)
I Heroku skulle dette se sådan ud:
Nu er det alt, du skal gøre! Din Heroku-app genstartes, hver gang du ændrer en konfigurationsvariabel - så din app skal nu køre H2 lokalt og skulle være klar forbundet med PostgreSQL, når den implementeres på Heroku.
Bare hvis du spørger:Hvorfor konfigurerer vi Tomcat JDBC i stedet for Hikari
Som du måske har bemærket, tilføjede vi tomcat-jdbc
afhængighed af vores pom.xml og konfigurerede SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource
som en miljøvariabel. Der er kun en lille antydning i dokumenterne om dette ordsprog
Du kan omgå denne algoritme fuldstændigt og angive den forbindelsespulje, der skal bruges, ved at indstille egenskaben spring.datasource.type. Dette er især vigtigt, hvis du kører dit program i en Tomcat-beholder, ...
Der er flere grunde til, at jeg skiftede tilbage til Tomcat-pooling af DataSource i stedet for at bruge Spring Boot 2.x-standarden HikariCP. Som jeg allerede har forklaret her, hvis du ikke specificerer spring.datasource.url
, Spring vil forsøge at autowire den indlejrede im-memory H2-database i stedet for vores PostgreSQL. Og problemet med Hikari er, at den kun understøtter spring.datasource.jdbc-url
.
For det andet, hvis jeg prøver at bruge Heroku-konfigurationen som vist for Hikari (så udelader SPRING_DATASOURCE_TYPE
og ændre SPRING_DATASOURCE_URL
til SPRING_DATASOURCE_JDBC-URL
) Jeg støder på følgende undtagelse:
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å jeg fik ikke Spring Boot 2.x til at arbejde på Heroku &Postgres med HikariCP, men med Tomcat JDBC - og jeg ønsker heller ikke at bremse min udviklingsproces, der indeholder en lokal H2-database beskrevet på forhånd. Husk:Vi ledte efter den enkleste, reneste måde at oprette forbindelse til Heroku Postgres i en Spring Boot-app ved hjælp af JPA/Hibernate!