如何使用Spring Boot使用Postgresql将Spring应用程序部署到Heroku?

时间:2014-04-13 09:41:04

标签: java spring postgresql heroku spring-4

我正在评估Heroku上的Spring 4,到目前为止,我对这两者印象非常深刻。

但是,我无法让我的Spring Boot应用程序在Heroku上运行。一切都运行正常,除了Postgresql(我只是得到Connection Refused错误)。

问题肯定与我如何设置DataSource有关,但到目前为止我一直在遵循试错方法!我不确定我应该如何设置Heroku DATABASE_URL的数据源,我找不到任何示例。

我偶然发现了spring-cloud在谷歌搜索看起来很有前景但却没有解释DATABASE_URL的任何内容。另外,在Spring.IO上甚至没有提到它,所以我想知道它是否是生产使用的选项?

5 个答案:

答案 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_USERSPRING_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。所以你必须确保没有

  • 命令行参数(通过Procfile传递)
  • 来自java:comp / env的JNDI属性(不知道那些可能来自Heroku的地方。)
  • Java系统属性(也可以通过Procfile传递为-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指定两个额外的连接属性。

我必须配置以下属性:

  • SSL =真
  • sslfactory = org.postgresql.ssl.NonValidatingFactory

这是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中为您提供的值。