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

Connessione a Heroku Postgres da Spring Boot

Il modo più semplice e pulito per Spring Boot 2.x con Heroku e Postgres

Ho letto tutte le risposte, ma non ho trovato quello che Jonik stava cercando:

Sto cercando il modo più semplice e pulito per connettermi a HerokuPostgres in un'app Spring Boot usando JPA/Hibernate

Il processo di sviluppo che la maggior parte delle persone desidera utilizzare con Spring Boot &Heroku include un database in memoria H2 locale per test e cicli di sviluppo rapidi e il database Heroku Postgres per la messa in scena e la produzione su Heroku.

  • La prima cosa è che non è necessario utilizzare i profili Spring per questo!
  • Secondo:non è necessario scrivere/modificare alcun codice!

Diamo un'occhiata a cosa dobbiamo fare passo dopo passo. Ho un progetto di esempio in atto che fornisce una distribuzione e una configurazione Heroku completamente funzionante per Postgres - solo per completezza, se vuoi testarlo tu stesso:github.com/jonashackt/spring-boot-vuejs.

Il pom.xml

Abbiamo bisogno delle seguenti dipendenze:

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

Una cosa complicata qui è l'uso di tomcat-jdbc , ma lo tratteremo tra un secondo.

Configura le variabili d'ambiente su Heroku

In Heroku le variabili d'ambiente sono denominate Config Vars . Hai sentito bene, tutto ciò che dobbiamo fare è configurare le variabili d'ambiente! Abbiamo solo bisogno di quelli corretti. Quindi vai su https://data.heroku.com/ (presumo che ci sia già un database Postgres configurato per la tua app Heroku, che è il comportamento predefinito).

Ora fai clic sul Datastore corrispondente alla tua applicazione e passa alle Settings scheda. Quindi fare clic su View Credentials... , che dovrebbe assomigliare a questo:

Ora apri una nuova scheda del browser e vai alle Settings della tua applicazione Heroku scheda anche. Fare clic su Reveal Config Vars e crea le seguenti variabili d'ambiente:

  • SPRING_DATASOURCE_URL =jdbc :postgresql ://YourPostgresHerokuHostNamequi :5432/Il tuo PostgresHerokuDatabaseNamequi (attenzione al jdbc: iniziale e il ql oltre a postgres !)
  • SPRING_DATASOURCE_USERNAME =YourPostgresHerokuUserNamequi
  • SPRING_DATASOURCE_PASSWORD =YourPostgresHerokuPasswordqui
  • SPRING_DATASOURCE_DRIVER-CLASS-NAME =org.postgresql.Driver (questo non è sempre necessario poiché Spring Boot può dedurlo per la maggior parte dei database dall'URL, solo per completezza qui)
  • SPRING_JPA_DATABASE-PLATFORM =org.hibernate.dialect.PostgreSQLDialect
  • SPRING_DATASOURCE_TYPE =org.apache.tomcat.jdbc.pool.DataSource
  • SPRING_JPA_HIBERNATE_DDL-AUTO =update (questo creerà automaticamente le tue tabelle in base alle tue entità JPA, il che è davvero fantastico, dal momento che non devi superare ostacoli con CREATE istruzioni SQL o file DDL)

In Heroku dovrebbe apparire così:

Ora non devi fare altro! La tua app Heroku viene riavviata ogni volta che modifichi una variabile di configurazione, quindi la tua app dovrebbe ora essere eseguita H2 localmente e dovrebbe essere pronta per essere connessa a PostgreSQL una volta distribuita su Heroku.

Solo se stai chiedendo:perché configuriamo Tomcat JDBC invece di Hikari

Come avrai notato, abbiamo aggiunto il tomcat-jdbc dipendenza dal nostro pom.xml e configurato SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource come variabile d'ambiente. C'è solo un leggero accenno nei documenti su questo detto

È possibile ignorare completamente tale algoritmo e specificare il pool di connessioni da utilizzare impostando la proprietà spring.datasource.type. Ciò è particolarmente importante se esegui la tua applicazione in un contenitore Tomcat, ...

Ci sono diversi motivi per cui sono tornato a Tomcat raggruppando DataSource invece di utilizzare lo standard HikariCP Spring Boot 2.x. Come ho già spiegato qui, se non specifichi spring.datasource.url , Spring proverà a cablare automaticamente il database H2 im-memory incorporato invece del nostro PostgreSQL. E il problema con Hikari è che supporta solo spring.datasource.jdbc-url .

Secondo, se provo a usare la configurazione di Heroku come mostrato per Hikari (quindi tralasciando SPRING_DATASOURCE_TYPE e modificando SPRING_DATASOURCE_URL a SPRING_DATASOURCE_JDBC-URL ) Mi imbatto nella seguente eccezione:

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

Quindi non ho fatto funzionare Spring Boot 2.x su Heroku e Postgres con HikariCP, ma con Tomcat JDBC - e inoltre non voglio interrompere il mio processo di sviluppo contenente un database H2 locale descritto in anticipo. Ricorda:stavamo cercando il modo più semplice e pulito per connetterci a Heroku Postgres in un'app Spring Boot utilizzando JPA/Hibernate!