Heroku&Postgresを使用したSpringBoot2.xの最もクリーンな方法
すべての回答を読みましたが、Jonikが探していたものが見つかりませんでした:
JPA/Hibernateを使用してSpringBootアプリでHerokuPostgresに接続する最も簡単でクリーンな方法を探しています
ほとんどの人がSpringBoot&Herokuで使用したい開発プロセスには、テストと高速開発サイクルのためのローカルH2インメモリデータベースと、Herokuでのステージングと本番用のHerokuPostgresデータベースが含まれます。
- まず、Springプロファイルを使用する必要はありません!
- 2番目:コードを記述/変更する必要はありません!
ステップバイステップで何をしなければならないかを見てみましょう。 Postgresの完全に機能するHerokuのデプロイと構成を提供するサンプルプロジェクトがあります。完全を期すために、自分でテストする場合に限ります:github.com/jonashackt/spring-boot-vuejs。
pom.xml
次の依存関係が必要です:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- In-Memory database used for local development & testing -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<!-- Switch back from Spring Boot 2.x standard HikariCP to Tomcat JDBC,
configured later in Heroku (see https://stackoverflow.com/a/49970142/4964553) -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</dependency>
<!-- PostgreSQL used in Staging and Production environment, e.g. on Heroku -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.2</version>
</dependency>
ここで注意が必要なのは、 tomcat-jdbc
の使用法です。 、しかしそれについてはすぐに説明します。
Herokuで環境変数を構成する
Heroku環境では、変数の名前は Config Vars
です。 。 正しく聞こえました。私たちがしなければならないのは、環境変数を構成することだけです! 正しいものが必要です。したがって、https://data.heroku.com/にアクセスしてください(デフォルトの動作である、Herokuアプリ用に構成されたPostgresデータベースがすでに存在すると思います)。
次に、アプリケーションの対応する Datastore
をクリックします。 設定
に切り替えます タブ。次に、 View Credentials ...
をクリックします 、次のようになります:
次に、新しいブラウザタブを開き、Herokuアプリケーションの設定
に移動します。 タブも。 Reveal Config Vars
をクリックします 次の環境変数を作成します:
-
SPRING_DATASOURCE_URL
= jdbc :postgres ql :// YourPostgresHerokuHostNameHere :5432 / YourPostgresHerokuDatabaseNameHere (先頭のjdbc:
に注意してください およびql
postgres
に加えて !) -
SPRING_DATASOURCE_USERNAME
=YourPostgresHerokuUserNameHere -
SPRING_DATASOURCE_PASSWORD
=YourPostgresHerokuPasswordHere -
SPRING_DATASOURCE_DRIVER-CLASS-NAME
=org.postgresql.Driver
(Spring BootはほとんどのデータベースのURLから推測できるため、これは必ずしも必要ではありません。ここで完全を期すためです) -
SPRING_JPA_DATABASE-PLATFORM
=org.hibernate.dialect.PostgreSQLDialect
-
SPRING_DATASOURCE_TYPE
=org.apache.tomcat.jdbc.pool.DataSource
-
SPRING_JPA_HIBERNATE_DDL-AUTO
=更新コード> (これにより、JPAエンティティに従ってテーブルが自動的に作成されます。これは非常に優れています。
CREATE
でハードルを設定する必要がないためです。 SQLステートメントまたはDDLファイル)
Herokuでは、これは次のようになります。
これで、あなたがしなければならないのはそれだけです! 構成変数を変更するたびにHerokuアプリが再起動されるため、アプリはローカルでH2を実行し、HerokuにデプロイするとPostgreSQLに接続できるようになります。
質問している場合:Hikariの代わりにTomcatJDBCを構成する理由
お気づきかもしれませんが、 tomcat-jdbc
を追加しました pom.xmlへの依存関係と構成済みのSPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource
環境変数として。このことわざについてのドキュメントにはほんのわずかなヒントがあります
そのアルゴリズムを完全にバイパスし、spring.datasource.typeプロパティを設定することで、使用する接続プールを指定できます。これは、Tomcatコンテナでアプリケーションを実行する場合に特に重要です...
Spring Boot 2.x標準のHikariCPを使用する代わりに、Tomcatプーリングデータソースに切り替えた理由はいくつかあります。ここですでに説明したように、 spring.datasource.url
を指定しない場合 、Springは、PostgreSQLデータベースの代わりに組み込みのim-memoryH2データベースを自動配線しようとします。また、Hikariの問題は、 spring.datasource.jdbc-url
のみをサポートしていることです。 。
次に、Hikariで示されているようにHeroku構成を使用しようとすると( SPRING_DATASOURCE_TYPE
を省略します) SPRING_DATASOURCE_URL
を変更します SPRING_DATASOURCE_JDBC-URL
へ )次の例外が発生しました:
Caused by: java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
そのため、Spring Boot 2.xをHikariCPを使用してHerokuとPostgresで動作させることはできませんでしたが、Tomcat JDBCを使用しました。また、事前に説明したローカルH2データベースを含む開発プロセスにブレーキをかけたくありません。注意: JPA /Hibernateを使用してSpringBootアプリでHerokuPostgresに接続する最も簡単でクリーンな方法を探していました!