2016-09-18 17 views
10

Tôi đang chạy Spring Boot kết nối với cơ sở dữ liệu PostgreSQL. Tôi đã xác minh rằng dữ liệu được ghi vào cơ sở dữ liệu nếu Khởi động mùa xuân được khởi động sau cơ sở dữ liệu.Làm cách nào để khởi động Spring Boot tự động kết nối lại với PostgreSQL?

spring.datasource.url = jdbc:postgresql://localhost/dbname 
spring.datasource.username = user 
spring.datasource.password = secret 
spring.datasource.driver-class-name = org.postgresql.Driver 
spring.datasource.testOnBorrow=true 
spring.datasource.validationQuery=SELECT 1 

Khi có sự thay đổi trong cơ sở dữ liệu trong phát triển, tôi chạy vào trường hợp ngoại lệ: PreparedStatementCallback; SQL []; This connection has been closed.; nested exception is org.postgresql.util.PSQLException: This connection has been closed.

Lưu ý rằng cơ sở dữ liệu có thể truy cập lại khi ngoại lệ xảy ra; Tôi nghĩ rằng vấn đề là kết nối là cũ vì điểm cuối cơ sở dữ liệu nó ban đầu kết nối với không còn có sẵn vì khởi động lại. Khởi động lại Spring Boot sẽ giải quyết vấn đề.

Làm cách nào để định cấu hình Spring Boot để kết nối lại với PostgreSQL để tôi không cần khởi động lại?

Tôi đã cố gắng làm theo các câu trả lời trong Spring Boot JPA - configuring auto reconnectHow to reconnect database if the connection closed in spring jpa?. Tôi không chắc liệu hành vi PostgreSQL có khác với MySQL hay không. Đọc của tôi về Spring Boot documentation đã không giúp đỡ; Tôi không biết các thành phần được mô tả đủ tốt để hiểu tài liệu nào tôi nên xem xét.

+1

Bạn đang sử dụng hồ bơi kết nối nào? Nếu bạn không sử dụng nó, bạn có thể muốn thử chuyển sang Hikari. Tôi đã nhìn thấy vấn đề như thế này trong quá khứ với 'tomcat-jdbc' là hồ bơi kết nối mặc định trong thời gian này. –

+1

Bạn có kiểm tra về khoản vay, nhưng bạn cũng có thể muốn đặt séc khi không hoạt động và không hoạt động. Bằng cách đó, các kết nối được kiểm tra thường xuyên và bị xóa khỏi nhóm nếu không hợp lệ. –

+0

@AndyWilkinson Tôi nghĩ rằng tôi đang sử dụng tomcat-jdbc vì pom của tôi bao gồm spring-boot-starter-jdbc. – mattm

Trả lời

6

Khởi động mùa xuân phải được cấu hình để kết nối lại tự động, vấn đề là nó không nhận thức được kết nối bị hỏng.

Vì bạn đang sử dụng thử nghiệm trên truy vấn vay và xác thực, chỉ cần thử giảm khoảng thời gian xác thực để nó được thực thi mọi lúc.

spring.datasource.tomcat.test-on-borrow=true 
spring.datasource.tomcat.validation-query=SELECT 1 
spring.datasource.tomcat.validation-interval=0 

Tomcat jdbc connection pool trên văn bản trên mượn:

(boolean) Các chỉ số cho biết đối tượng sẽ được xác nhận trước khi được vay mượn từ các hồ bơi. Nếu đối tượng không xác thực được, nó sẽ bị loại khỏi hồ bơi, và chúng tôi sẽ cố gắng mượn một đối tượng khác. LƯU Ý - cho một giá trị thực sự có bất kỳ hiệu ứng nào, tham số validationQuery hoặc validatorClassName phải được đặt thành một chuỗi không null. Để có xác thực hiệu quả hơn, hãy xem validationInterval. Giá trị mặc định là false

Nhưng hãy nhận thức (khoảng xác nhận):

(dài) tránh xác nhận dư thừa, chỉ chạy xác nhận tại hầu hết ở tần số này - thời gian trong mili giây. Nếu kết nối đến hạn để xác nhận, nhưng đã được xác nhận trước đó trong khoảng thời gian này, nó sẽ không được xác nhận lại. Giá trị mặc định là 30000 (30 giây).

Các vấn đề liên quan