短篇小说:
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
,是因为:
答案 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_URL
以postgres
开头,而Postgres的JDBC前缀为postgresql
。将SPRING_DATASOURCE_URL
与前缀jdbc:postgres://
一起使用将导致以下错误:
驱动程序org.h2.Driver声称不接受jdbcUrl,jdbc:postgres:// ....