sql >> Databasteknik >  >> RDS >> PostgreSQL

Ansluter till Heroku Postgres från Spring Boot

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 inledande jdbc: och ql tillägg till postgres !)
  • SPRING_DATASOURCE_USERNAME =YourPostgresHerokuUserNameHere
  • SPRING_DATASOURCE_PASSWORD =YourPostgresHerokuPasswordHere
  • SPRING_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 med CREATE 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!



  1. SQL Server Databas Snapshots -4

  2. Skapa en kopia av en databas i PostgreSQL

  3. Problemuppsättning 1 – Identifiera enheter

  4. Använda Trace Flag 3226 för att undertrycka loggning av säkerhetskopiering