Einfachster und sauberster Weg für Spring Boot 2.x mit Heroku &Postgres
Ich habe alle Antworten gelesen, aber nicht gefunden, wonach Jonik gesucht hat:
Ich suche nach der einfachsten und saubersten Möglichkeit, eine Verbindung zu HerokuPostgres in einer Spring Boot-App mit JPA/Hibernate herzustellen
Der Entwicklungsprozess, den die meisten Benutzer mit Spring Boot und Heroku verwenden möchten, umfasst eine lokale H2-In-Memory-Datenbank zum Testen und für schnelle Entwicklungszyklen – und die Heroku Postgres-Datenbank zum Bereitstellen und Produzieren auf Heroku.
- Das erste ist, dass Sie dafür keine Spring-Profile verwenden müssen!
- Zweitens:Sie müssen keinen Code schreiben/ändern!
Schauen wir uns Schritt für Schritt an, was wir tun müssen. Ich habe ein Beispielprojekt eingerichtet, das eine voll funktionsfähige Heroku-Bereitstellung und -Konfiguration für Postgres bereitstellt – nur der Vollständigkeit halber, wenn Sie es selbst testen möchten:github.com/jonashackt/spring-boot-vuejs.
Die pom.xml
Wir benötigen die folgenden Abhängigkeiten:
<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>
Eine schwierige Sache ist hier die Verwendung von tomcat-jdbc
, aber dazu kommen wir gleich.
Umgebungsvariablen auf Heroku konfigurieren
In Heroku werden Umgebungsvariablen Config Vars
genannt . Sie haben richtig gehört, wir müssen nur Umgebungsvariablen konfigurieren! Wir brauchen nur die richtigen. Gehen Sie daher zu https://data.heroku.com/ (ich nehme an, dass bereits eine Postgres-Datenbank für Ihre Heroku-App konfiguriert ist, was das Standardverhalten ist).
Klicken Sie nun auf den entsprechenden Datastore
Ihrer Anwendung und wechseln Sie zu den Settings
Tab. Klicken Sie dann auf View Credentials...
, die in etwa so aussehen sollte:
Öffnen Sie nun einen neuen Browser-Tab und gehen Sie zu den Settings
Ihrer Heroku-Anwendung Registerkarte auch. Klicken Sie auf Reveal Config Vars
und erstellen Sie die folgenden Umgebungsvariablen:
SPRING_DATASOURCE_URL
=jdbc :postgresql ://IhrPostgresHerokuHostNameHier :5432/YourPostgresHerokuDatabaseNameHier (Achten Sie auf den vorangestelltenjdbc:
und dieql
Ergänzung zupostgres
!)SPRING_DATASOURCE_USERNAME
=IhrPostgresHerokuBenutzernameHierSPRING_DATASOURCE_PASSWORD
=YourPostgresHerokuPasswordHierSPRING_DATASOURCE_DRIVER-CLASS-NAME
=org.postgresql.Driver
(Dies ist nicht immer erforderlich, da Spring Boot es für die meisten Datenbanken aus der URL ableiten kann, hier nur der Vollständigkeit halber)SPRING_JPA_DATABASE-PLATFORM
=org.hibernate.dialect.PostgreSQLDialect
SPRING_DATASOURCE_TYPE
=org.apache.tomcat.jdbc.pool.DataSource
SPRING_JPA_HIBERNATE_DDL-AUTO
=update
(Dadurch werden Ihre Tabellen automatisch gemäß Ihren JPA-Entitäten erstellt, was wirklich großartig ist - da Sie sich nicht mitCREATE
herumschlagen müssen SQL-Anweisungen oder DDL-Dateien)
In Heroku sollte dies so aussehen:
Das ist alles, was Sie tun müssen! Ihre Heroku-App wird jedes Mal neu gestartet, wenn Sie eine Konfigurationsvariable ändern. Daher sollte Ihre App jetzt H2 lokal ausführen und sollte bereit sein, mit PostgreSQL verbunden zu sein, wenn sie auf Heroku bereitgestellt wird.
Nur wenn Sie fragen:Warum konfigurieren wir Tomcat JDBC statt Hikari
Wie Sie vielleicht bemerkt haben, haben wir tomcat-jdbc
hinzugefügt Abhängigkeit zu unserer pom.xml und konfigurierten SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource
als Umgebungsvariable. In den Dokumenten gibt es nur einen kleinen Hinweis auf diesen Spruch
Sie können diesen Algorithmus vollständig umgehen und den zu verwendenden Verbindungspool angeben, indem Sie die Eigenschaft spring.datasource.type festlegen. Dies ist besonders wichtig, wenn Sie Ihre Anwendung in einem Tomcat-Container ausführen, ...
Es gibt mehrere Gründe, warum ich zurück zu Tomcat Pooling DataSource gewechselt bin, anstatt den Spring Boot 2.x Standard HikariCP zu verwenden. Wie ich hier bereits erklärt habe, wenn Sie spring.datasource.url
nicht angeben , Spring wird versuchen, die eingebettete Im-Memory-H2-Datenbank anstelle unserer PostgreSQL-Datenbank automatisch zu verdrahten. Und das Problem mit Hikari ist, dass es nur spring.datasource.jdbc-url
unterstützt .
Zweitens, wenn ich versuche, die Heroku-Konfiguration wie für Hikari gezeigt zu verwenden (also SPRING_DATASOURCE_TYPE
wegzulassen). und Ändern von SPRING_DATASOURCE_URL
zu SPRING_DATASOURCE_JDBC-URL
) stoße ich auf die folgende Ausnahme:
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
So habe ich Spring Boot 2.x nicht mit HikariCP auf Heroku &Postgres zum Laufen gebracht, sondern mit Tomcat JDBC - und ich möchte auch nicht meinen Entwicklungsprozess mit einer vorab beschriebenen lokalen H2-Datenbank bremsen. Denken Sie daran:Wir haben nach der einfachsten und saubersten Möglichkeit gesucht, eine Verbindung zu Heroku Postgres in einer Spring Boot-App mit JPA/Hibernate herzustellen!