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

但是,我在让 Spring Boot 应用程序在 Heroku 上运行时遇到问题。一切工作正常,除了 Postgresql (我刚刚得到 Connection Refused 错误)。

问题肯定与我如何设置有关 DataSource 但到目前为止,我只是在遵循尝试和错误的方法!我不太确定应该如何从 Heroku 设置数据源 DATABASE_URL 我找不到任何例子。

我已经发现 春云 偶然在谷歌上搜索,看起来很有希望,但它没有解释任何关于 DATABASE_URL. 。另外,Spring.IO 上甚至没有提到它,所以我想知道它是否是生产使用的一个选项?

有帮助吗?

解决方案

Spring Cloud 是一个不错的选择。我不知道为什么它没有在 spring.io 中列出 - 它应该是,也许它还没有完全脱离孵化或其他什么,但我已经成功地使用了它。如果你不喜欢使用它,我想你可以设置 spring.datasource.url Heroku 在其环境变量中给你的值。

其他提示

您可以使用 配置变量 可以在 Heroku 应用程序的设置选项卡中进行配置。配置变量将作为环境变量公开给您的应用程序。由于 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_PASSWORD 马上。这 SPRING_DATASOURCE_URL 必须这样构造:

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

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

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

  • 命令行参数(通过 过程文件)
  • 来自 java:comp/env 的 JNDI 属性(不知道这些属性在 Heroku 中可能来自哪里。)
  • Java 系统属性(也可以通过 Procfile 传递 -D 论据)

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

在与此问题斗争了一段时间后,我想补充一件事——仅创建一个配置对象对于 Heroku 来说是不够的,即使使用 Spring Cloud 连接器也是如此。您还必须显式声明云配置文件(-Dspring.profiles.active=cloud) 在您的应用程序 Procfile 中。

除了 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')
}

如果我没记错的话,我遇到了同样的问题,并通读了 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 库依赖。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top