Le moyen le plus simple et le plus propre pour Spring Boot 2.x avec Heroku et Postgres
J'ai lu toutes les réponses, mais je n'ai pas trouvé ce que Jonik cherchait :
Je recherche le moyen le plus simple et le plus propre de me connecter à HerokuPostgres dans une application Spring Boot à l'aide de JPA/Hibernate
Le processus de développement que la plupart des gens souhaitent utiliser avec Spring Boot &Heroku comprend une base de données locale en mémoire H2 pour les tests et les cycles de développement rapides - et la base de données Heroku Postgres pour la mise en scène et la production sur Heroku.
- Tout d'abord, vous n'avez pas besoin d'utiliser les profils Spring pour cela !
- Deuxièmement :vous n'avez pas besoin d'écrire/modifier de code !
Voyons ce que nous devons faire étape par étape. J'ai un exemple de projet en place qui fournit un déploiement et une configuration Heroku entièrement fonctionnels pour Postgres - uniquement dans un souci d'exhaustivité, si vous souhaitez le tester vous-même :github.com/jonashackt/spring-boot-vuejs.
Le pom.xml
Nous avons besoin des dépendances suivantes :
<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>
Une chose délicate ici est l'utilisation de tomcat-jdbc
, mais nous couvrirons cela dans une seconde.
Configurer les variables d'environnement sur Heroku
Dans Heroku, les variables d'environnement sont nommées Config Vars
. Vous avez bien entendu, tout ce que nous avons à faire est de configurer les variables d'environnement ! Nous avons juste besoin des bons. Par conséquent, rendez-vous sur https://data.heroku.com/ (je suppose qu'il existe déjà une base de données Postgres configurée pour votre application Heroku, ce qui est le comportement par défaut).
Cliquez maintenant sur le Datastore
correspondant à votre application et passez aux Settings
languette. Cliquez ensuite sur View Credentials...
, qui devrait ressembler à ceci :
Ouvrez maintenant un nouvel onglet de navigateur et accédez aux Settings
de votre application Heroku onglet également. Cliquez sur Reveal Config Vars
et créez les variables d'environnement suivantes :
SPRING_DATASOURCE_URL
=jdbc :postgresql ://YourPostgresHerokuHostNameHere :5432/VotreNomBaseDeDonnéesHerokuPostgresici (attention au premierjdbc:
et leql
ajout àpostgres
!)SPRING_DATASOURCE_USERNAME
=YourPostgresHerokuUserNameHereSPRING_DATASOURCE_PASSWORD
=YourPostgresHerokuPasswordHereSPRING_DATASOURCE_DRIVER-CLASS-NAME
=org.postgresql.Driver
(ce n'est pas toujours nécessaire puisque Spring Boot peut le déduire pour la plupart des bases de données à partir de l'URL, juste pour être complet ici)SPRING_JPA_DATABASE-PLATFORM
=org.hibernate.dialect.PostgreSQLDialect
SPRING_DATASOURCE_TYPE
=org.apache.tomcat.jdbc.pool.DataSource
SPRING_JPA_HIBERNATE_DDL-AUTO
=update
(cela créera automatiquement vos tables en fonction de vos entités JPA, ce qui est vraiment génial - puisque vous n'avez pas besoin de vous débrouiller avecCREATE
instructions SQL ou fichiers DDL)
Dans Heroku, cela devrait ressembler à ceci :
Maintenant, c'est tout ce que vous avez à faire ! Votre application Heroku est redémarrée chaque fois que vous modifiez une variable de configuration. Votre application doit donc maintenant exécuter H2 localement et être prête à être connectée à PostgreSQL lorsqu'elle est déployée sur Heroku.
Juste si vous demandez :pourquoi configurons-nous Tomcat JDBC au lieu de Hikari
Comme vous l'avez peut-être remarqué, nous avons ajouté le tomcat-jdbc
dépendance à notre pom.xml et configuré SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource
en tant que variable d'environnement. Il n'y a qu'un léger indice dans la documentation à propos de ce dicton
Vous pouvez contourner complètement cet algorithme et spécifier le pool de connexions à utiliser en définissant la propriété spring.datasource.type. Ceci est particulièrement important si vous exécutez votre application dans un conteneur Tomcat, ...
Il y a plusieurs raisons pour lesquelles je suis revenu à Tomcat pooling DataSource au lieu d'utiliser le HikariCP standard de Spring Boot 2.x. Comme je l'ai déjà expliqué ici, si vous ne spécifiez pas spring.datasource.url
, Spring essaiera de câbler automatiquement la base de données im-memory H2 intégrée au lieu de notre base PostgreSQL. Et le problème avec Hikari est qu'il ne supporte que spring.datasource.jdbc-url
.
Deuxièmement, si j'essaie d'utiliser la configuration Heroku comme indiqué pour Hikari (donc en omettant SPRING_DATASOURCE_TYPE
et modifier SPRING_DATASOURCE_URL
vers SPRING_DATASOURCE_JDBC-URL
) Je rencontre l'exception suivante :
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
Donc, je n'ai pas fait fonctionner Spring Boot 2.x sur Heroku &Postgres avec HikariCP, mais avec Tomcat JDBC - et je ne veux pas non plus freiner mon processus de développement contenant une base de données H2 locale décrite à l'avance. N'oubliez pas :nous recherchions le moyen le plus simple et le plus propre de se connecter à Heroku Postgres dans une application Spring Boot à l'aide de JPA/Hibernate !