PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Menghubungkan ke Heroku Postgres dari Spring Boot

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 (ingat jdbc: leading terkemuka dan ql tambahan ke postgres !)
  • SPRING_DATASOURCE_USERNAME =YourPostgresHerokuUserNameDi Sini
  • SPRING_DATASOURCE_PASSWORD =YourPostgresHerokuPasswordDi Sini
  • SPRING_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 dengan CREATE 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!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Alat Sumber Terbuka Teratas untuk Migrasi PostgreSQL

  2. Cara mengkonfigurasi SELinux untuk PostgreSQL dan TimescaleDB

  3. Bagaimana cara memasukkan baris yang dikecualikan di RETURNING from INSERT ... ON CONFLICT

  4. Ratakan pasangan kunci/nilai gabungan dari bidang JSONB?

  5. Jumlah pesanan pengulangan / duplikat berturut-turut