Postgresql を使用した Spring アプリを Spring Boot を使用して Heroku にデプロイするにはどうすればよいですか?
-
21-12-2019 - |
質問
私は Heroku で Spring 4 を評価していますが、これまでのところ両方に非常に感銘を受けています。
ただし、Spring Boot アプリを Heroku で実行するのに問題があります。Postgresql を除いて、すべてが正常に動作しています (ただ、 Connection Refused
エラー)。
問題は間違いなくセットアップ方法に関係するでしょう。 DataSource
しかし、これまでのところ、私は試行錯誤のアプローチに従っているだけです。Heroku からデータ ソースをどのように設定すればよいのかよくわかりません。 DATABASE_URL
そして例が見つかりません。
見つけた 春の雲 偶然、Google で検索したところ、有望に見えましたが、それについては何も説明されていませんでした。 DATABASE_URL
. 。また、Spring.IO でも言及されていないので、本番環境での使用のオプションであるかどうか疑問に思っています。
解決
スプリングクラウドは良い選択肢です。私はそれがなぜそれが春。あなたがそれを使用していないのなら、私はおそらくspring.datasource.url
をValue Herokuに設定することができると思います。
他のヒント
使用できます 構成変数 これは 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>
データベース接続ページの対応する値に置き換える必要があります。最後になりましたが、 SPRING_DATASOURCE_DRIVER-CLASS-NAME
に設定する必要があります org.postgresql.Driver
.
このようにして、環境固有の構成をアプリケーションに追加する代わりに、Spring Boot のビルドイン機能を使用できます。ただし、Spring Boot には特定の 外部設定の読み取り順序. 。したがって、何もないことを確認する必要があります。
- コマンドライン引数 ( プロファイル)
- java:comp/env の JNDI 属性 (これらが Heroku のどこから来るのかはわかりません。)
- Java システム プロパティ (Procfile 経由で次のように渡すこともできます)
-D
引数)
これらは OS 環境変数をオーバーライドするためです。
これに苦しんでいった後に追加したいのですが、Spring Cloudコネクタでも、Herokuでは、設定オブジェクトを作成するだけではありません。また、アプリケーションPROCFILEでクラウドプロファイル(-Dspring.profiles.active=cloud
)を明示的に宣言する必要があります。
DATABASE_URL
とは別に、常にそこにあるため、Sherokuは実行時に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
.
休止状態/ 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')
}
. 私が正しく覚えていれば、私は同じ問題を抱えて、私がデータソースの2つの追加の接続プロパティを指定する必要があることを私が見つけたことを発見したところで同じ問題を読みました。
次のプロパティを設定しなければなりませんでした:
- ssl= true
- sslfactory= org.postgresql.ssl.nonvalidatingfactory
これはデータソース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 ライブラリ依存関係を追加する必要があります。