我正在评估Heroku上的Spring 4,到目前为止,我对这两者印象非常深刻。
但是,我无法让我的Spring Boot应用程序在Heroku上运行。一切都运行正常,除了Postgresql(我只是得到Connection Refused
错误)。
问题肯定与我如何设置DataSource
有关,但到目前为止我一直在遵循试错方法!我不确定我应该如何设置Heroku DATABASE_URL
的数据源,我找不到任何示例。
我偶然发现了spring-cloud在谷歌搜索看起来很有前景但却没有解释DATABASE_URL
的任何内容。另外,在Spring.IO上甚至没有提到它,所以我想知道它是否是生产使用的选项?
答案 0 :(得分:7)
您可以使用Config Vars,可以在Heroku的应用程序的设置选项卡中进行配置。 Config Vars将作为环境变量公开给您的应用程序。由于Spring Boot可以将环境变量映射到应用程序属性,因此您只需设置:
SPRING_DATASOURCE_URL
SPRING_DATASOURCE_USER
SPRING_DATASOURCE_PASSWORD
SPRING_DATASOURCE_DRIVER-CLASS-NAME
他们将被映射到:
spring.datasource.url
spring.datasource.user
spring.datasource.password
spring.datasource.driver-class-name
现在您要做的就是提取相关值。可以在heroku postgres management panel检查完整的数据库配置。选择您要连接的数据库,您会立即看到SPRING_DATASOURCE_USER
和SPRING_DATASOURCE_PASSWORD
的值。 SPRING_DATASOURCE_URL
必须像这样构建:
jdbc:postgresql://<Host>:<Port>/<Database>
<Host>
,<Port>
和<Database>
必须替换为数据库连接页面中的相应值。最后但并非最不重要的是SPRING_DATASOURCE_DRIVER-CLASS-NAME
必须设置为org.postgresql.Driver
。
通过这种方式,您可以使用Spring Boot的内置功能,而不是为应用程序添加特定于环境的配置。但请注意,Spring Boot具有特定的order of reading external configuration。所以你必须确保没有
-D
参数)因为那些会覆盖OS环境变量。
答案 1 :(得分:2)
我想在一段时间内挣扎之后添加一件事 - 仅仅使用Heroku创建配置对象是不够的,即使使用Spring云连接器也是如此。您还必须在应用程序Procfile中明确声明云配置文件(-Dspring.profiles.active=cloud
)。
答案 2 :(得分:2)
除了始终存在的DATABASE_URL
之外,Heroku在运行时创建了3个环境变量。他们是:
JDBC_DATABASE_URL
JDBC_DATABASE_USERNAME
JDBC_DATABASE_PASSWORD
您可能知道,如果在spring.datasource.*
文件中找到application.properties
属性,Spring Boot将自动配置您的数据库。这是我的application.properties
spring.datasource.url=${JDBC_DATABASE_URL}
spring.datasource.username=${JDBC_DATABASE_USERNAME}
spring.datasource.password=${JDBC_DATABASE_PASSWORD}
spring.jpa.show-sql=false
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
Hibernate / Postgres依赖
在我的情况下,我正在使用Hibernate(在spring-boot-starter-jpa
中捆绑了PostgreSQL,所以我需要在build.gradle
中使用正确的依赖项:
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile('org.postgresql:postgresql:9.4.1212')
}
答案 3 :(得分:1)
如果我没记错,我遇到了同样的问题并阅读了Heroku Postgres文档,我发现我需要为DataSource指定两个额外的连接属性。
我必须配置以下属性:
这是DataSource bean的一个示例:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${database.driverClassName}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
<property name="connectionProperties" value="ssl=true;sslfactory=org.postgresql.ssl.NonValidatingFactory"/>
</bean>
您当然需要添加PostgreSql库依赖项。
答案 4 :(得分:-3)
Spring Cloud是一个不错的选择。我不知道为什么它没有在spring.io中列出 - 它应该是,也许它还没有完全没有孵化或什么,但我已成功使用它。如果您不喜欢使用它我认为您可以将spring.datasource.url
设置为Heroku在其env var中为您提供的值。