[英]How to do I deploy a Spring app using Postgresql to Heroku using Spring Boot?
我正在评估Heroku上的Spring 4,到目前为止我对两者都印象深刻。
但是,我无法让我的Spring Boot应用程序在Heroku上运行。 一切都运行正常,除了Postgresql(我只是得到Connection Refused
错误)。
问题肯定与我如何设置DataSource
但到目前为止我一直在遵循试错法! 我不确定我应该如何从Heroku DATABASE_URL
设置数据源,我找不到任何示例。
我发现弹簧云偶然通过搜索谷歌看起来很有前途,但它并没有解释有关的任何事情DATABASE_URL
。 另外,它甚至没有在Spring.IO上提及,所以我想知道它是否甚至是生产使用的选项?
您可以使用配置瓦尔可以在你的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管理面板上检查完整的数据库配置。 选择要连接的数据库,您将立即看到SPRING_DATASOURCE_USER
和SPRING_DATASOURCE_PASSWORD
的值。 SPRING_DATASOURCE_URL
必须像这样构造:
jdbc:postgresql://<Host>:<Port>/<Database>
其中<Host>
, <Port>
和<Database>
必须替换为<Database>
连接页面中的相应值。 最后但并非最不重要的是, SPRING_DATASOURCE_DRIVER-CLASS-NAME
必须设置为org.postgresql.Driver
。
这样,您可以使用Spring Boot的内置功能,而不是为应用程序添加特定于环境的配置。 但请注意,Spring Boot具有读取外部配置的特定顺序 。 所以你必须确保没有
-D
参数传递) 因为那些会覆盖OS环境变量。
有一点我想在这个问题上挣扎一段时间之后 - 仅仅使用Heroku来创建一个配置对象是不够的,即使使用Spring云连接器也是如此。 您还必须在应用程序Procfile中明确声明云配置文件( -Dspring.profiles.active=cloud
)。
除了始终存在的DATABASE_URL
之外,Heroku还在运行时创建了3个环境变量。 他们是:
JDBC_DATABASE_URL
JDBC_DATABASE_USERNAME
JDBC_DATABASE_PASSWORD
您可能知道,如果在您的application.properties
文件中找到spring.datasource.*
属性,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
使用正确的依赖build.gradle
:
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile('org.postgresql:postgresql:9.4.1212')
}
如果我没记错的话,我遇到了同样的问题并阅读了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库依赖项。
Spring Cloud是一个不错的选择。 我不知道为什么它没有在spring.io中列出 - 它应该是,也许它还没有完全没有孵化还是什么,但我已成功使用它。 如果您不喜欢使用它,我认为您可以将spring.datasource.url
设置为Heroku在其env var中为您提供的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.