sql >> Database >  >> RDS >> PostgreSQL

Verbinding maken met Heroku Postgres vanuit Spring Boot

De eenvoudigste en schoonste manier voor Spring Boot 2.x met Heroku &Postgres

Ik heb alle antwoorden gelezen, maar vond niet wat Jonik zocht:

Ik ben op zoek naar de eenvoudigste, schoonste manier om verbinding te maken met HerokuPostgres in een Spring Boot-app met behulp van JPA/Hibernate

Het ontwikkelingsproces dat de meeste mensen willen gebruiken met Spring Boot &Heroku omvat een lokale H2 in-memory database voor testen en snelle ontwikkelingscycli - en de Heroku Postgres-database voor enscenering en productie op Heroku.

  • Het eerste is - je hoeft daarvoor geen Spring-profielen te gebruiken!
  • Ten tweede:je hoeft geen code te schrijven/wijzigen!

Laten we stap voor stap bekijken wat we moeten doen. Ik heb een voorbeeldproject dat een volledig werkende Heroku-implementatie en configuratie voor Postgres biedt - alleen voor de volledigheid, als je het zelf wilt testen:github.com/jonashackt/spring-boot-vuejs.

De pom.xml

We hebben de volgende afhankelijkheden nodig:

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

Een lastig punt hier is het gebruik van tomcat-jdbc , maar dat bespreken we zo.

Configureer omgevingsvariabelen op Heroku

In Heroku hebben omgevingsvariabelen de naam Config Vars . Je hebt het goed gehoord, we hoeven alleen maar omgevingsvariabelen te configureren! We hebben alleen de juiste nodig. Ga daarom naar https://data.heroku.com/ (ik neem aan dat er al een Postgres-database is geconfigureerd voor uw Heroku-app, wat het standaardgedrag is).

Klik nu op de overeenkomstige Datastore van uw toepassing en schakel over naar de Settings tabblad. Klik vervolgens op View Credentials... , die er ongeveer zo uit zou moeten zien:

Open nu een nieuw browsertabblad en ga naar de Settings van uw Heroku-toepassing tabblad ook. Klik op Reveal Config Vars en maak de volgende omgevingsvariabelen:

  • SPRING_DATASOURCE_URL =jdbc :postgresql ://YourPostgresHerokuHostNameHere :5432/YourPostgresHerokuDatabaseNameHere (let op de leidende jdbc: en de ql aanvulling op postgres !)
  • SPRING_DATASOURCE_USERNAME =YourPostgresHerokuUserNameHere
  • SPRING_DATASOURCE_PASSWORD =YourPostgresHerokuPasswordHere
  • SPRING_DATASOURCE_DRIVER-CLASS-NAME =org.postgresql.Driver (dit is niet altijd nodig aangezien Spring Boot dit voor de meeste databases uit de url kan afleiden, voor de volledigheid hier)
  • SPRING_JPA_DATABASE-PLATFORM =org.hibernate.dialect.PostgreSQLDialect
  • SPRING_DATASOURCE_TYPE =org.apache.tomcat.jdbc.pool.DataSource
  • SPRING_JPA_HIBERNATE_DDL-AUTO =update (dit zal automatisch uw tabellen maken volgens uw JPA-entiteiten, wat echt geweldig is - aangezien u geen hindernis hoeft te nemen met CREATE SQL-instructies of DDL-bestanden)

In Heroku zou dit er als volgt uit moeten zien:

Dat is alles wat je hoeft te doen! Je Heroku-app wordt elke keer dat je een configuratievariabele wijzigt opnieuw gestart, dus je app zou nu lokaal H2 moeten draaien en klaar moeten zijn voor verbinding met PostgreSQL wanneer deze op Heroku wordt geïmplementeerd.

Als je vraagt:waarom configureren we Tomcat JDBC in plaats van Hikari

Zoals je misschien hebt gemerkt, hebben we de tomcat-jdbc . toegevoegd afhankelijkheid van onze pom.xml en geconfigureerd SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource als een omgevingsvariabele. Er is slechts een kleine hint in de documenten over dit gezegde

U kunt dat algoritme volledig omzeilen en de te gebruiken verbindingspool specificeren door de eigenschap spring.datasource.type in te stellen. Dit is vooral belangrijk als je je applicatie in een Tomcat-container draait, ...

Er zijn verschillende redenen waarom ik terugging naar Tomcat-pooling van DataSource in plaats van de Spring Boot 2.x-standaard HikariCP te gebruiken. Zoals ik hier al heb uitgelegd, als u spring.datasource.url niet specificeert , zal Spring proberen de ingebouwde im-memory H2-database automatisch te bedraden in plaats van onze PostgreSQL-database. En het probleem met Hikari is dat het alleen spring.datasource.jdbc-url ondersteunt .

Ten tweede, als ik de Heroku-configuratie probeer te gebruiken zoals getoond voor Hikari (dus SPRING_DATASOURCE_TYPE weglatend en het wijzigen van SPRING_DATASOURCE_URL naar SPRING_DATASOURCE_JDBC-URL ) Ik kom de volgende uitzondering tegen:

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

Dus ik kreeg Spring Boot 2.x niet aan het werk op Heroku &Postgres met HikariCP, maar met Tomcat JDBC - en ik wil ook mijn ontwikkelingsproces met een vooraf beschreven lokale H2-database niet onderbreken. Onthoud:we waren op zoek naar de eenvoudigste, schoonste manier om verbinding te maken met Heroku Postgres in een Spring Boot-app met behulp van JPA/Hibernate!



  1. Datum in een URL dd/mm/jjjj

  2. PL/pgSQL-kolomnaam hetzelfde als variabele

  3. MySQL - Voorwaardelijke beperkingen voor externe sleutels

  4. Procedure verwacht een parameter die niet is opgegeven