PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Kết nối với Heroku Postgres từ Spring Boot

Cách đơn giản nhất cho Spring Boot 2.x với Heroku &Postgres

Tôi đã đọc tất cả các câu trả lời, nhưng không tìm thấy những gì Jonik đang tìm kiếm:

Tôi đang tìm cách đơn giản nhất, rõ ràng nhất để kết nối với HerokuPostgres trong ứng dụng Spring Boot bằng JPA / Hibernate

Quá trình phát triển mà hầu hết mọi người muốn sử dụng với Spring Boot &Heroku bao gồm cơ sở dữ liệu trong bộ nhớ H2 cục bộ để thử nghiệm và chu kỳ phát triển nhanh - và cơ sở dữ liệu Heroku Postgres để dàn dựng và sản xuất trên Heroku.

  • Điều đầu tiên là - bạn không cần sử dụng cấu hình Spring cho việc đó!
  • Thứ hai:Bạn không cần viết / thay đổi bất kỳ mã nào!

Chúng ta hãy xem xét những gì chúng ta phải làm từng bước. Tôi có một dự án mẫu tại chỗ cung cấp cấu hình và triển khai Heroku hoạt động đầy đủ cho Postgres - chỉ nhằm mục đích hoàn chỉnh, nếu bạn muốn tự kiểm tra:github.com/jonashackt/spring-boot-vuejs.

pom.xml

Chúng tôi cần các loại tiền sau:

    <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>

Một điều khó khăn ở đây là việc sử dụng tomcat-jdbc , nhưng chúng tôi sẽ trình bày điều đó trong giây lát.

Định cấu hình các biến môi trường trên Heroku

Trong môi trường Heroku, các biến được đặt tên là Config Vars . Bạn nghe đúng rồi, tất cả những gì chúng tôi phải làm là định cấu hình Biến môi trường! Chúng tôi chỉ cần những cái chính xác. Do đó, hãy truy cập https://data.heroku.com/ (Tôi cho rằng đã có cơ sở dữ liệu Postgres được định cấu hình cho ứng dụng Heroku của bạn, đây là hành vi mặc định).

Bây giờ hãy nhấp vào Datastore tương ứng của ứng dụng của bạn và chuyển sang Settings chuyển hướng. Sau đó nhấp vào View Credentials... , trông giống như sau:

Bây giờ, hãy mở một tab trình duyệt mới và đi tới Settings của ứng dụng Heroku của bạn tab cũng được. Nhấp vào Reveal Config Vars và tạo các Biến Môi trường sau:

  • SPRING_DATASOURCE_URL = jdbc :postgres ql :// YourPostgresHerokuHostNameHere :5432 / YourPostgresHerokuDatabaseNameHere (nhớ jdbc: hàng đầu và ql thêm vào postgres !)
  • SPRING_DATASOURCE_USERNAME =YourPostgresHerokuUserNameHere
  • SPRING_DATASOURCE_PASSWORD =YourPostgresHerokuPasswordHere
  • SPRING_DATASOURCE_DRIVER-CLASS-NAME =org.postgresql.Driver (Điều này không phải lúc nào cũng cần thiết vì Spring Boot có thể suy ra nó cho hầu hết các cơ sở dữ liệu từ url, chỉ cần tính đầy đủ ở đây)
  • SPRING_JPA_DATABASE-PLATFORM =org.hibernate.dialect.PostgreSQLDialect
  • SPRING_DATASOURCE_TYPE =org.apache.tomcat.jdbc.pool.DataSource
  • SPRING_JPA_HIBERNATE_DDL-AUTO =update (điều này sẽ tự động tạo các bảng của bạn theo các thực thể JPA của bạn, điều này thực sự tuyệt vời - vì bạn không cần phải gặp trở ngại với CREATE Câu lệnh SQL hoặc tệp DDL)

Trong Heroku, nó sẽ giống như thế này:

Bây giờ, đó là tất cả những gì bạn phải làm! Ứng dụng Heroku của bạn được khởi động lại mỗi khi bạn thay đổi Biến cấu hình - vì vậy, Ứng dụng của bạn bây giờ sẽ chạy H2 cục bộ và sẵn sàng kết nối với PostgreSQL khi được triển khai trên Heroku.

Chỉ cần bạn hỏi:Tại sao chúng tôi định cấu hình Tomcat JDBC thay vì Hikari

Như bạn có thể nhận thấy, chúng tôi đã thêm tomcat-jdbc phụ thuộc vào pom.xml của chúng tôi và được định cấu hình SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource như một biến Môi trường. Chỉ có một gợi ý nhỏ trong tài liệu về câu nói này

Bạn có thể bỏ qua hoàn toàn thuật toán đó và chỉ định vùng kết nối để sử dụng bằng cách đặt thuộc tính spring.datasource.type. Điều này đặc biệt quan trọng nếu bạn chạy ứng dụng của mình trong vùng chứa Tomcat, ...

Có một số lý do khiến tôi quay trở lại Tomcat gộp DataSource thay vì sử dụng HikariCP chuẩn Spring Boot 2.x. Như tôi đã giải thích ở đây, nếu bạn không xác định rõ spring.datasource.url , Spring sẽ cố gắng chạy tự động cơ sở dữ liệu H2 im-memory được nhúng thay vì PostgreSQL của chúng tôi. Và vấn đề với Hikari là nó chỉ hỗ trợ spring.datasource.jdbc-url .

Thứ hai, nếu tôi cố gắng sử dụng cấu hình Heroku như được hiển thị cho Hikari (vì vậy hãy loại bỏ SPRING_DATASOURCE_TYPE và thay đổi SPRING_DATASOURCE_URL tới SPRING_DATASOURCE_JDBC-URL ) Tôi gặp phải Ngoại lệ sau:

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

Vì vậy, tôi đã không nhận được Spring Boot 2.x hoạt động trên Heroku &Postgres với HikariCP, nhưng với Tomcat JDBC - và tôi cũng không muốn dừng quá trình phát triển của mình có chứa cơ sở dữ liệu H2 cục bộ được mô tả trước. Hãy nhớ rằng:Chúng tôi đang tìm kiếm cách đơn giản nhất, rõ ràng nhất để kết nối với Heroku Postgres trong ứng dụng Spring Boot bằng 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. Ràng buộc thả PostgreSQL với tên không xác định

  2. Chỉ mục một phần không được sử dụng trong mệnh đề ON CONFLICT khi thực hiện nâng cấp trong Postgresql

  3. Cắt bỏ tất cả các bảng trong cơ sở dữ liệu Postgres

  4. Giám sát PostgreSQL chủ động (Góc nhà phát triển / Cố vấn)

  5. PostgreSQL có thể thực hiện kết hợp giữa hai thủ tục được lưu trữ trên SQL Server không?