9

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

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

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

我通过在谷歌上搜索偶然发现了spring-cloudDATABASE_URL ,它看起来很有希望,但它没有解释任何关于. 此外,Spring.IO 甚至都没有提到它,所以我想知道它是否甚至是生产使用的一个选项?

4

5 回答 5

9

您可以使用可以在 Heroku 应用程序的设置选项卡中配置的Config Vars 。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_USERSPRING_DATASOURCE_PASSWORDSPRING_DATASOURCE_URL必须像这样构造:

jdbc:postgresql://<Host>:<Port>/<Database>

其中<Host>,<Port><Database>必须替换为来自数据库连接页面的相应值。最后但并非最不重要的SPRING_DATASOURCE_DRIVER-CLASS-NAME必须设置为org.postgresql.Driver.

通过这种方式,您可以使用 Spring Boot 的内置功能,而不是向应用程序添加特定于环境的配置。但是请注意,Spring Boot 具有读取外部配置的特定顺序。所以你必须确保没有

  • 命令行参数(通过Procfile传递)
  • 来自 java:comp/env 的 JNDI 属性(不知道这些可能来自 Heroku。)
  • Java 系统属性(也可以通过 Procfile 作为-D参数传递)

因为那些会覆盖操作系统环境变量。

于 2015-10-02T07:46:14.870 回答
2

经过一段时间的努力,我想添加一件事——仅仅创建一个配置对象对于 Heroku 来说是不够的,即使是使用 spring 云连接器也是如此。您还必须-Dspring.profiles.active=cloud在应用程序 Procfile 中显式声明云配置文件 ( )。

于 2015-09-22T18:12:16.067 回答
2

除了DATABASE_URL总是存在的,Heroku 在运行时创建 3 个环境变量。他们是:

JDBC_DATABASE_URL
JDBC_DATABASE_USERNAME
JDBC_DATABASE_PASSWORD

您可能知道,如果 Spring Boot在您的文件中找到spring.datasource.*属性,它将自动配置您的数据库。application.properties这是我的 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')
}
于 2016-12-07T14:44:33.780 回答
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库依赖项。

于 2014-04-13T20:05:28.450 回答
-3

Spring Cloud 是一个不错的选择。我不知道为什么它没有在 spring.io 中列出 - 应该是,也许它还没有完全脱离孵化之类的,但我已经成功使用它。如果您不喜欢使用它,我认为您可以将 设置spring.datasource.url为 Heroku 在其 env var 中为您提供的值。

于 2014-04-13T11:26:56.520 回答