sql >> Databáze >  >> RDS >> PostgreSQL

Připojování k Heroku Postgres ze Spring Boot

Nejjednodušší nejčistší způsob pro Spring Boot 2.x s Heroku &Postgres

Přečetl jsem všechny odpovědi, ale nenašel jsem, co Jonik hledal:

Hledám nejjednodušší a nejčistší způsob připojení k HerokuPostgres v aplikaci Spring Boot pomocí JPA/Hibernate

Vývojový proces, který chce většina lidí používat se Spring Boot &Heroku, zahrnuje lokální H2 in-memory databázi pro testování a rychlé vývojové cykly – a databázi Heroku Postgres pro staging a produkci na Heroku.

  • První věc je – k tomu nepotřebujete používat profily Spring!
  • Za druhé:Nemusíte psát/měnit žádný kód!

Pojďme se podívat na to, co musíme udělat krok za krokem. Mám příklad projektu, který poskytuje plně funkční nasazení a konfiguraci Heroku pro Postgres – pouze pro úplnost, pokud si to chcete sami vyzkoušet:github.com/jonashackt/spring-boot-vuejs.

Pom.xml

Potřebujeme následující závislosti:

    <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>

Jedna ošemetná věc je zde použití tomcat-jdbc , ale to probereme za sekundu.

Konfigurace proměnných prostředí na Heroku

V Heroku se proměnné prostředí jmenují Config Vars . Slyšeli jste dobře, vše, co musíme udělat, je nakonfigurovat proměnné prostředí! Potřebujeme jen ty správné. Přejděte proto na https://data.heroku.com/ (předpokládám, že již existuje databáze Postgres nakonfigurovaná pro vaši aplikaci Heroku, což je výchozí chování).

Nyní klikněte na odpovídající Datastore vaší aplikace a přepněte do Settings tab. Poté klikněte na View Credentials... , který by měl vypadat nějak podobně:

Nyní otevřete novou kartu prohlížeče a přejděte do Settings vaší aplikace Heroku karta také. Klikněte na Reveal Config Vars a vytvořte následující proměnné prostředí:

  • SPRING_DATASOURCE_URL =jdbc :postgresql ://YourPostgresHerokuHostNameHere :5432/YourPostgresHerokuDatabaseNameHere (pamatujte na úvodní jdbc: a ql přidání do postgres !)
  • SPRING_DATASOURCE_USERNAME =YourPostgresHerokuUserNameHere
  • SPRING_DATASOURCE_PASSWORD =YourPostgresHerokuPasswordHere
  • SPRING_DATASOURCE_DRIVER-CLASS-NAME =org.postgresql.Driver (toto není vždy potřeba, protože Spring Boot to dokáže odvodit pro většinu databází z adresy URL, jen pro úplnost zde)
  • SPRING_JPA_DATABASE-PLATFORM =org.hibernate.dialect.PostgreSQLDialect
  • SPRING_DATASOURCE_TYPE =org.apache.tomcat.jdbc.pool.DataSource
  • SPRING_JPA_HIBERNATE_DDL-AUTO =update (toto automaticky vytvoří vaše tabulky podle vašich JPA entit, což je opravdu skvělé - protože se nemusíte trápit s CREATE Příkazy SQL nebo soubory DDL)

V Heroku by to mělo vypadat takto:

To je vše, co musíte udělat! Vaše aplikace Heroku se restartuje pokaždé, když změníte konfigurační proměnnou – takže vaše aplikace by nyní měla běžet H2 lokálně a měla by být připravena propojená s PostgreSQL při nasazení na Heroku.

Jen když se ptáte:Proč konfigurujeme Tomcat JDBC místo Hikari

Jak jste si možná všimli, přidali jsme tomcat-jdbc závislost na našem pom.xml a nakonfigurovaný SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource jako proměnná prostředí. V dokumentech je o tomto rčení jen nepatrný náznak

Tento algoritmus můžete zcela obejít a určit fond připojení, který se má použít, nastavením vlastnosti spring.datasource.type. To je zvláště důležité, pokud aplikaci spouštíte v kontejneru Tomcat, ...

Existuje několik důvodů, proč jsem přešel zpět na Tomcat pooling DataSource namísto použití standardu Spring Boot 2.x HikariCP. Jak jsem zde již vysvětlil, pokud nezadáte spring.datasource.url Spring se pokusí automaticky připojit vestavěnou databázi im-memory H2 namísto naší PostgreSQL. A problém s Hikari je, že podporuje pouze spring.datasource.jdbc-url .

Za druhé, pokud se pokusím použít konfiguraci Heroku, jak je ukázáno pro Hikari (takže vynechám SPRING_DATASOURCE_TYPE a změnou SPRING_DATASOURCE_URL na SPRING_DATASOURCE_JDBC-URL ) Narazil jsem na následující výjimku:

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

Takže jsem nedostal Spring Boot 2.x pracující na Heroku &Postgres s HikariCP, ale s Tomcat JDBC - a také nechci brzdit můj vývojový proces obsahující lokální databázi H2 popsanou předem. Pamatujte:Hledali jsme nejjednodušší a nejčistší způsob připojení k Heroku Postgres v aplikaci Spring Boot pomocí JPA/Hibernate!



  1. Vytvořte propojený server mezi dvěma kontejnery Docker se systémem SQL Server (příklad T-SQL)

  2. PostgreSQL INSERT ON CONFLICT UPDATE (upsert) použijte všechny vyloučené hodnoty

  3. SQL Server:Užitečné tipy pro nováčky

  4. Funkce RPAD() v PostgreSQL