【问题标题】:How to do I deploy a Spring app using Postgresql to Heroku using Spring Boot?如何使用 Spring Boot 将使用 Postgresql 的 Spring 应用程序部署到 Heroku?
【发布时间】:2014-05-27 07:05:44
【问题描述】:

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

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

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

我在 Google 上搜索时偶然发现了 spring-cloud,这看起来很有希望,但它没有解释任何关于 DATABASE_URL 的信息。此外,Spring.IO 上甚至都没有提到它,所以我想知道它是否是生产使用的选项?

【问题讨论】:

    标签: java spring postgresql heroku spring-4


    【解决方案1】:

    您可以使用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 参数传递)

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

    【讨论】:

    • SPRING_DATASOURCE_USER 对我不起作用,但 SPRING_DATASOURCE_USERNAME 起作用,
    【解决方案2】:

    在为此苦苦挣扎了一段时间后,我想添加一件事 - 仅使用 Heroku 创建配置对象是不够的,即使使用 Spring Cloud 连接器也是如此。您还必须在应用程序 Procfile 中明确声明云配置文件 (-Dspring.profiles.active=cloud)。

    【讨论】:

    • 能否展示您的 Procfile 和 java 文件,以便我们看看它是如何工作的?
    【解决方案3】:

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

    JDBC_DATABASE_URL
    JDBC_DATABASE_USERNAME
    JDBC_DATABASE_PASSWORD
    

    您可能知道,如果 Spring Boot 在您的 application.properties 文件中找到 spring.datasource.* 属性,它将自动配置您的数据库。这是我的 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(与 PostgreSQL 捆绑在 spring-boot-starter-jpa 中,所以我需要在我的 build.gradle 中使用正确的依赖项:

    dependencies {
        compile("org.springframework.boot:spring-boot-starter-data-jpa")
        compile('org.postgresql:postgresql:9.4.1212')
    }
    

    【讨论】:

      【解决方案4】:

      如果我没记错的话,我也遇到了同样的问题,阅读 Heroku Postgres 文档后发现我需要为 DataSource 指定两个额外的连接属性。

      我必须配置以下属性:

      • ssl=true
      • 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 库依赖。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        猜你喜欢
        • 2021-07-25
        • 2021-05-21
        • 1970-01-01
        • 1970-01-01
        • 2020-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-16
        相关资源
        最近更新 更多