sql >> Database teknologi >  >> RDS >> PostgreSQL

Tilslutning til Heroku Postgres fra Spring Boot

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ørende jdbc: og ql tilføjelse til postgres !)
  • SPRING_DATASOURCE_USERNAME =YourPostgresHerokuUserNameHere
  • SPRING_DATASOURCE_PASSWORD =YourPostgresHerokuPasswordHere
  • SPRING_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 med CREATE 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!



  1. Hvad er formatet for PostgreSQL-forbindelsesstrengen / URL'en?

  2. Sådan kombinerer du resultaterne af to forespørgsler i SQL

  3. Sådan erklærer du brugerdefineret undtagelse ved hjælp af en undtagelsesvariabel i Oracle-databasen

  4. Sådan fungerer INSERT()-funktionen i MariaDB