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àopostgres
!) -
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ớiCREATE
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!