sql >> Base de Datos >  >> RDS >> PostgreSQL

Conexión a Heroku Postgres desde Spring Boot

La forma más sencilla y limpia de Spring Boot 2.x con Heroku y Postgres

Leí todas las respuestas, pero no encontré lo que buscaba Jonik:

Estoy buscando la forma más simple y limpia de conectarme a HerokuPostgres en una aplicación Spring Boot usando JPA/Hibernate

El proceso de desarrollo que la mayoría de la gente quiere usar con Spring Boot y Heroku incluye una base de datos en memoria H2 local para pruebas y ciclos rápidos de desarrollo, y la base de datos Postgres de Heroku para puesta en escena y producción en Heroku.

  • Lo primero es:¡no necesitas usar perfiles de Spring para eso!
  • Segundo:¡No necesitas escribir/cambiar ningún código!

Echemos un vistazo a lo que tenemos que hacer paso a paso. Tengo un proyecto de ejemplo que proporciona una implementación y configuración de Heroku completamente funcional para Postgres, solo por el bien de la exhaustividad, si desea probarlo usted mismo:github.com/jonashackt/spring-boot-vuejs.

El pom.xml

Necesitamos las siguientes dependencias:

    <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 complicada aquí es el uso de tomcat-jdbc , pero lo cubriremos en un segundo.

Configurar variables de entorno en Heroku

En Heroku, las variables de entorno se denominan Config Vars . Has oído bien, ¡todo lo que tenemos que hacer es configurar las variables de entorno! Solo necesitamos los correctos. Por lo tanto, diríjase a https://data.heroku.com/ (supongo que ya hay una base de datos de Postgres configurada para su aplicación Heroku, que es el comportamiento predeterminado).

Ahora haga clic en el Datastore correspondiente de su aplicación y cambie a Settings pestaña. Luego haga clic en View Credentials... , que debería tener un aspecto similar a este:

Ahora abra una nueva pestaña del navegador y vaya a la Settings de su aplicación Heroku. ficha también. Haga clic en Reveal Config Vars y cree las siguientes variables de entorno:

  • SPRING_DATASOURCE_URL =jdbc :postgresql ://TuPostgresHerokuHostNameAquí :5432/El nombre de la base de datos de PostgresHeroku aquí (Cuidado con el jdbc: inicial y el ql adición a postgres !)
  • SPRING_DATASOURCE_USERNAME =SuNombreDeUsuarioHerokuPostgresAquí
  • SPRING_DATASOURCE_PASSWORD =TuContraseñaPostgresHerokuAquí
  • SPRING_DATASOURCE_DRIVER-CLASS-NAME =org.postgresql.Driver (esto no siempre es necesario ya que Spring Boot puede deducirlo para la mayoría de las bases de datos de la URL, solo para completar aquí)
  • SPRING_JPA_DATABASE-PLATFORM =org.hibernate.dialect.PostgreSQLDialect
  • SPRING_DATASOURCE_TYPE =org.apache.tomcat.jdbc.pool.DataSource
  • SPRING_JPA_HIBERNATE_DDL-AUTO =update (esto creará automáticamente sus tablas de acuerdo con sus entidades JPA, lo cual es realmente genial, ya que no necesita obstaculizar con CREATE sentencias SQL o archivos DDL)

En Heroku, esto debería verse así:

¡Eso es todo lo que tienes que hacer! Su aplicación Heroku se reinicia cada vez que cambia una variable de configuración, por lo que su aplicación ahora debería ejecutar H2 localmente y debería estar lista para conectarse con PostgreSQL cuando se implemente en Heroku.

Solo si estás preguntando:¿Por qué configuramos Tomcat JDBC en lugar de Hikari

Como habrás notado, agregamos el tomcat-jdbc dependencia a nuestro pom.xml y configurado SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource como una variable de entorno. Solo hay una ligera pista en los documentos sobre este dicho

Puede omitir ese algoritmo por completo y especificar el conjunto de conexiones que se usará configurando la propiedad spring.datasource.type. Esto es especialmente importante si ejecuta su aplicación en un contenedor Tomcat, ...

Hay varias razones por las que volví a usar Tomcat pooling DataSource en lugar de usar el HikariCP estándar de Spring Boot 2.x. Como ya expliqué aquí, si no especifica spring.datasource.url , Spring intentará conectar automáticamente la base de datos im-memory H2 integrada en lugar de nuestra PostgreSQL. Y el problema con Hikari es que solo admite spring.datasource.jdbc-url .

En segundo lugar, si trato de usar la configuración de Heroku como se muestra para Hikari (dejando de lado SPRING_DATASOURCE_TYPE y cambiando SPRING_DATASOURCE_URL a SPRING_DATASOURCE_JDBC-URL ) Me encuentro con la siguiente Excepción:

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

Así que Spring Boot 2.x no funcionó en Heroku y Postgres con HikariCP, sino con Tomcat JDBC, y tampoco quiero frenar mi proceso de desarrollo que contiene una base de datos H2 local descrita por adelantado. Recuerde:¡Estábamos buscando la forma más simple y limpia de conectarnos a Heroku Postgres en una aplicación Spring Boot usando JPA/Hibernate!