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 oqlalé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.PostgreSQLDialectSPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSourceSPRING_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 comCREATEInstruçõ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!