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 aljdbc:
iniziale e ilql
oltre apostgres
!)SPRING_DATASOURCE_USERNAME
=YourPostgresHerokuUserNamequiSPRING_DATASOURCE_PASSWORD
=YourPostgresHerokuPasswordquiSPRING_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 conCREATE
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!