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 ojdbc:
principal e oql
além depostgres
!)SPRING_DATASOURCE_USERNAME
=YourPostgresHerokuUserNameAquiSPRING_DATASOURCE_PASSWORD
=YourPostgresHerokuSenhaAquiSPRING_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 comCREATE
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!