PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Herstellen einer Verbindung zu Heroku Postgres von Spring Boot

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 vorangestellten jdbc: und die ql Ergänzung zu postgres !)
  • SPRING_DATASOURCE_USERNAME =IhrPostgresHerokuBenutzernameHier
  • SPRING_DATASOURCE_PASSWORD =YourPostgresHerokuPasswordHier
  • SPRING_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 mit CREATE 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!