[英]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.