Cara terbersih paling sederhana untuk Spring Boot 2.x dengan Heroku &Postgres
Saya membaca semua jawaban, tetapi tidak menemukan apa yang dicari Jonik:
Saya mencari cara paling sederhana dan terbersih untuk terhubung ke HerokuPostgres di aplikasi Spring Boot menggunakan JPA/Hibernate
Proses pengembangan yang ingin digunakan kebanyakan orang dengan Spring Boot &Heroku mencakup database dalam memori H2 lokal untuk pengujian &siklus pengembangan cepat - dan database Heroku Postgres untuk staging dan produksi di Heroku.
- Hal pertama adalah - Anda tidak perlu menggunakan profil Spring untuk itu!
- Kedua:Anda tidak perlu menulis/mengubah kode apa pun!
Mari kita lihat apa yang harus kita lakukan langkah demi langkah. Saya memiliki proyek contoh yang menyediakan penerapan dan konfigurasi Heroku yang berfungsi penuh untuk Postgres - hanya demi kelengkapan, jika Anda ingin mengujinya sendiri:github.com/jonashackt/spring-boot-vuejs.
Pom.xml
Kami membutuhkan ketergantungan berikut:
<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>
Satu hal yang rumit di sini adalah penggunaan tomcat-jdbc
, tapi kami akan membahasnya sebentar lagi.
Konfigurasi Variabel Lingkungan di Heroku
Dalam Lingkungan Heroku Variabel diberi nama Config Vars
. Anda salah dengar, yang harus kita lakukan hanyalah mengonfigurasi Variabel Lingkungan! Kami hanya membutuhkan yang benar. Oleh karena itu, buka https://data.heroku.com/ (saya berasumsi sudah ada database Postgres yang dikonfigurasi untuk aplikasi Heroku Anda, yang merupakan perilaku default).
Sekarang klik Datastore
yang sesuai dengan aplikasi Anda dan beralih ke Settings
tab. Kemudian klik View Credentials...
, yang seharusnya terlihat seperti ini:
Sekarang buka tab browser baru dan buka Settings
aplikasi Heroku Anda tab juga. Klik Reveal Config Vars
dan buat Variabel Lingkungan berikut:
SPRING_DATASOURCE_URL
=jdbc :postgresql ://YourPostgresHerokuHostNameDi Sini :5432/YourPostgresHerokuDatabaseNameDi Sini (ingatjdbc:
leading terkemuka danql
tambahan kepostgres
!)SPRING_DATASOURCE_USERNAME
=YourPostgresHerokuUserNameDi SiniSPRING_DATASOURCE_PASSWORD
=YourPostgresHerokuPasswordDi SiniSPRING_DATASOURCE_DRIVER-CLASS-NAME
=org.postgresql.Driver
(ini tidak selalu diperlukan karena Spring Boot dapat menyimpulkannya untuk sebagian besar database dari url, hanya untuk kelengkapan di sini)SPRING_JPA_DATABASE-PLATFORM
=org.hibernate.dialect.PostgreSQLDialect
SPRING_DATASOURCE_TYPE
=org.apache.tomcat.jdbc.pool.DataSource
SPRING_JPA_HIBERNATE_DDL-AUTO
=update
(ini akan secara otomatis membuat tabel Anda sesuai dengan entitas JPA Anda, yang sangat bagus - karena Anda tidak perlu repot denganCREATE
pernyataan SQL atau file DDL)
Di Heroku ini akan terlihat seperti ini:
Sekarang hanya itu yang harus Anda lakukan! Aplikasi Heroku Anda dimulai ulang setiap kali Anda mengubah Variabel Konfigurasi - jadi Aplikasi Anda sekarang harus menjalankan H2 secara lokal, dan harus siap terhubung dengan PostgreSQL saat digunakan di Heroku.
Hanya jika Anda bertanya:Mengapa kami mengonfigurasi Tomcat JDBC alih-alih Hikari
Seperti yang mungkin Anda perhatikan, kami menambahkan tomcat-jdbc
ketergantungan ke pom.xml kami dan mengkonfigurasi SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource
sebagai variabel Lingkungan. Hanya ada sedikit petunjuk di dokumen tentang pepatah ini
Anda dapat melewati algoritme itu sepenuhnya dan menentukan kumpulan koneksi yang akan digunakan dengan menyetel properti spring.datasource.type. Ini sangat penting jika Anda menjalankan aplikasi Anda dalam wadah Tomcat, ...
Ada beberapa alasan saya beralih kembali ke Tomcat pooling DataSource daripada menggunakan HikariCP standar Spring Boot 2.x. Seperti yang sudah saya jelaskan di sini, jika Anda tidak menentukan spring.datasource.url
, Spring akan mencoba mengotomatiskan database H2 im-memory yang disematkan alih-alih database PostgreSQL kami. Dan masalah dengan Hikari adalah, hanya mendukung spring.datasource.jdbc-url
.
Kedua, jika saya mencoba menggunakan konfigurasi Heroku seperti yang ditunjukkan untuk Hikari (jadi tinggalkan SPRING_DATASOURCE_TYPE
dan mengubah SPRING_DATASOURCE_URL
ke SPRING_DATASOURCE_JDBC-URL
) Saya mengalami Pengecualian berikut:
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
Jadi saya tidak membuat Spring Boot 2.x bekerja di Heroku &Postgres dengan HikariCP, tetapi dengan Tomcat JDBC - dan saya juga tidak ingin menghentikan proses pengembangan saya yang berisi database H2 lokal yang dijelaskan di awal. Ingat:Kami mencari cara termudah dan terbersih untuk terhubung ke Heroku Postgres di aplikasi Spring Boot menggunakan JPA/Hibernate!