PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Connexion à Heroku Postgres à partir de Spring Boot

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 premier jdbc: et le ql ajout à postgres !)
  • SPRING_DATASOURCE_USERNAME =YourPostgresHerokuUserNameHere
  • SPRING_DATASOURCE_PASSWORD =YourPostgresHerokuPasswordHere
  • SPRING_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 avec CREATE 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 !