PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Conectando-se ao Heroku Postgres a partir do Spring Boot

Maneira mais simples e limpa para Spring Boot 2.x com Heroku e Postgres


Li todas as respostas, mas não encontrei o que Jonik estava procurando:

Estou procurando a maneira mais simples e limpa de se conectar ao HerokuPostgres em um aplicativo Spring Boot usando JPA/Hibernate

O processo de desenvolvimento que a maioria das pessoas deseja usar com o Spring Boot &Heroku inclui um banco de dados local na memória H2 para testes e ciclos de desenvolvimento rápidos - e o banco de dados Heroku Postgres para teste e produção no Heroku.
  • A primeira coisa é - você não precisa usar perfis Spring para isso!
  • Segundo:Você não precisa escrever/alterar nenhum código!

Vamos dar uma olhada no que temos que fazer passo a passo. Eu tenho um projeto de exemplo que fornece uma implantação e configuração do Heroku totalmente funcional para o Postgres - apenas por uma questão de completude, se você quiser testá-lo:github.com/jonashackt/spring-boot-vuejs.

O pom.xml


Precisamos das seguintes dependências:
    <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>

Uma coisa complicada aqui é o uso de tomcat-jdbc , mas abordaremos isso em um segundo.

Configurar variáveis ​​de ambiente no Heroku


No Heroku, as variáveis ​​de ambiente são chamadas de Config Vars . Você ouviu certo, tudo o que precisamos fazer é configurar as variáveis ​​de ambiente! Só precisamos dos corretos. Portanto, vá para https://data.heroku.com/ (suponho que já exista um banco de dados Postgres configurado para seu aplicativo Heroku, que é o comportamento padrão).

Agora clique no Datastore correspondente do seu aplicativo e mude para as Settings aba. Em seguida, clique em View Credentials... , que deve ser algo parecido com isto:



Agora abra uma nova guia do navegador e vá para as Settings do seu aplicativo Heroku guia também. Clique em Reveal Config Vars e crie as seguintes variáveis ​​de ambiente:
  • SPRING_DATASOURCE_URL =jdbc :postgresql ://YourPostgresHerokuHostNameAqui :5432/SeuPostgresHerokuDatabaseNameAqui (cuidado com o jdbc: principal e o ql além de postgres !)
  • SPRING_DATASOURCE_USERNAME =YourPostgresHerokuUserNameAqui
  • SPRING_DATASOURCE_PASSWORD =YourPostgresHerokuSenhaAqui
  • SPRING_DATASOURCE_DRIVER-CLASS-NAME =org.postgresql.Driver (isso nem sempre é necessário, pois o Spring Boot pode deduzi-lo para a maioria dos bancos de dados da url, apenas para completar aqui)
  • SPRING_JPA_DATABASE-PLATFORM =org.hibernate.dialect.PostgreSQLDialect
  • SPRING_DATASOURCE_TYPE =org.apache.tomcat.jdbc.pool.DataSource
  • SPRING_JPA_HIBERNATE_DDL-AUTO =update (isso criará automaticamente suas tabelas de acordo com suas entidades JPA, o que é realmente ótimo - já que você não precisa se esforçar com CREATE Instruções SQL ou arquivos DDL)

No Heroku isso deve ficar assim:



Agora é tudo o que você precisa fazer! Seu aplicativo Heroku é reiniciado toda vez que você altera uma variável de configuração - portanto, seu aplicativo agora deve executar o H2 localmente e deve estar pronto para ser conectado ao PostgreSQL quando implantado no Heroku.

Só se você está perguntando:Por que configuramos o Tomcat JDBC em vez do Hikari


Como você deve ter notado, adicionamos o tomcat-jdbc dependência ao nosso pom.xml e configurado SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource como uma variável de ambiente. Há apenas uma pequena dica nos documentos sobre esse ditado

Você pode ignorar esse algoritmo completamente e especificar o pool de conexões a ser usado definindo a propriedade spring.datasource.type. Isso é especialmente importante se você executar seu aplicativo em um contêiner do Tomcat, ...

Há várias razões pelas quais voltei para o pool de dados do Tomcat em vez de usar o HikariCP padrão do Spring Boot 2.x. Como já expliquei aqui, se você não especificar spring.datasource.url , o Spring tentará conectar automaticamente o banco de dados H2 im-memory incorporado em vez do nosso PostgreSQL. E o problema com o Hikari é que ele só suporta spring.datasource.jdbc-url .

Segundo, se eu tentar usar a configuração do Heroku como mostrado para Hikari (deixando de fora SPRING_DATASOURCE_TYPE e alterando SPRING_DATASOURCE_URL para SPRING_DATASOURCE_JDBC-URL ) Eu me deparo com a seguinte exceção:
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

Então eu não consegui o Spring Boot 2.x trabalhando no Heroku &Postgres com HikariCP, mas com o Tomcat JDBC - e também não quero frear meu processo de desenvolvimento contendo um banco de dados H2 local descrito antecipadamente. Lembre-se:estávamos procurando a maneira mais simples e limpa de se conectar ao Heroku Postgres em um aplicativo Spring Boot usando JPA/Hibernate!