Spring Boot如何知道Heroku的DATABASE_URL配置变量?

时间:2018-11-30 10:14:30

标签: java spring postgresql spring-boot heroku

短篇小说:

Spring Boot如何准确解析DATABASE_URL配置变量?在本地PC上设置具有相同名称的环境属性无效。 Spring Boot库中涉及哪些类?在DATABASE_URL上进行的全文搜索不会返回任何内容。

长话:

我最近在Heroku上部署了一个简单的Spring Boot + JPA应用程序。我的heroku 已经配置了Postgres插件。

在第一次部署期间,我只想确认该应用程序已正确构建并启动。但是令我惊讶的是,该应用程序立即连接到在Heroku的DATABASE_URL config var中配置的Postgres数据库:

2018-11-30T09:28:51.054688+00:00 app[web.1]: 2018-11-30 09:28:51.054  INFO 4 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL95Dialect

这使我想到了上面已经发布的问题。

我正在使用Spring Boot 2.1.0。,它是由simple app创建的Spring Initializr,具有Web + JPA + H2 + {{1} }。之所以包含PostgreSQL,是因为:

  • 我想使用嵌入式H2运行单元测试
  • 大多数时候,我想使用嵌入式H2在本地运行我的应用程序,但是有时,我想切换到Heroku的Postgres,以便我可以验证一些特定于数据库的内容(例如,迁移)

3 个答案:

答案 0 :(得分:3)

Spring不了解DATABASE_URL(据我所知)。但是它确实会检测并自动使用SPRING_DATASOURCE_URL,它是Heroku Java buildpack在运行时设置的。

您可以在Connecting to Relational Databases on Heroku with Java上的Heroku文档中了解有关此环境变量的更多信息

答案 1 :(得分:2)

为了能够在h2和heroku之间轻松切换,一个人可以拥有2个配置文件

名为 application-h2.properties 的h2属性文件:

spring.profiles.active=h2
spring.datasource.url= # H2 URL of the database.
spring.datasource.driver-class-name=# H2 JDBC driver. Auto-detected based on the URL by default.
spring.datasource.password= # Login password of the database.
spring.datasource.username= # Login username of the database.

通过在运行Spring Boot应用程序时将h2配置文件设置为启用来激活:

java -jar -Dspring.profiles.active=h2 myApplication.jar

名为 application-heroku.properties 的heroku属性文件:

spring.profiles.active=heroku
spring.datasource.url= # herokuURL of the database.
spring.datasource.driver-class-name=# herokuJDBC driver. Auto-detected based on the URL by default.
spring.datasource.password= # Login password of the database.
spring.datasource.username= # Login username of the database.

通过在运行spring boot应用程序时将heroku配置文件设置为启用来激活:

java -jar -Dspring.profiles.active=heroku myApplication.jar

答案 2 :(得分:0)

我将回答我自己的问题,以用关于Heroku设置的环境属性的更多细节来修改已接受的答案。

假设您的Heroku应用程序包含环境变量:

  • DATABASE_URL = postgres://username:password@host:port/database

Heroku将自动提供以下环境变量(您可以在例如您最喜欢的基于JDBC的SQL客户端中使用):

  • JDBC_DATABASE_URL = jdbc:postgresql://host:port/database?user=username&password=password&sslmode=require
  • JDBC_DATABASE_USERNAME = username
  • JDBC_DATABASE_PASSWORD = password

还有Spring Boot自动拾取的那些(您可以用来修改本地Spring Boot配置文件:

  • SPRING_DATASOURCE_USERNAME =与JDBC_DATABASE_USERNAME
  • SPRING_DATASOURCE_PASSWORD =与JDBC_DATABASE_PASSWORD
  • SPRING_DATASOURCE_URL =与JDBC_DATABASE_URL

我通过使用一个简单的REST端点观察到了这一点:

@RequestMapping("/env")
public @ResponseBody Map<String, String> env() {
    return System.getenv();
}

请注意,不要犯与我相同的错误:DATABASE_URLpostgres开头,而Postgres的JDBC前缀为postgresql。将SPRING_DATASOURCE_URL与前缀jdbc:postgres://一起使用将导致以下错误:

  

驱动程序org.h2.Driver声称不接受jdbcUrl,jdbc:postgres:// ....