2016-09-18 155 views
10

我正在運行Spring Boot連接到PostgreSQL數據庫。如果在數據庫之後啓動Spring Boot,我已驗證數據已寫入數據庫。如何讓Spring Boot自動重新連接到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 

當有在開發數據庫的變化,我碰上例外: PreparedStatementCallback; SQL []; This connection has been closed.; nested exception is org.postgresql.util.PSQLException: This connection has been closed.

注意,數據庫訪問時,再次發生異常;我認爲問題在於連接已過時,因爲它最初連接到的數據庫端點由於重新啓動而不再可用。重新啓動Spring Boot可以解決問題。

如何配置Spring Boot重新連接到PostgreSQL,以便我不需要重新啓動它?

我試圖按照Spring Boot JPA - configuring auto reconnectHow to reconnect database if the connection closed in spring jpa?中的答案。我不確定PostgreSQL的行爲是否與MySQL不同。我對Spring Boot documentation的閱讀沒有幫助;我不知道所描述的組件是否足夠了解我應該查看哪些文檔。

+1

您正在使用哪個連接池?如果你不使用它,你可能想嘗試切換到Hikari。在過去,我已經看到過這樣的問題,它使用'tomcat-jdbc',這是當前的默認連接池。 –

+1

您有借用測試,但您可能還希望在空閒和空閒超時時設置檢查。這樣,連接被定期檢查並且如果無效則從池中移除。 –

+0

@AndyWilkinson我想我使用的是tomcat-jdbc,因爲我的pom包含spring-boot-starter-jdbc。 – mattm

回答

6

春季啓動應配置爲自動重新連接,問題是它不知道連接斷開。

由於您已經在借用和驗證查詢中使用了測試,只需嘗試即可減少驗證時間間隔,因此每次都會執行此操作。

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

上文本Tomcat jdbc connection pool上借:

(布爾值)的對象是否將從池中被借用被驗證之前的指示。如果對象無法驗證,它將從池中刪除,我們將嘗試借另一個。注 - 對於真正的值有任何影響,validationQuery或validatorClassName參數必須設置爲非空字符串。 爲了獲得更高效的驗證,請參閱validationInterval。默認值爲false

但要注意(驗證間隔):

(長)避免多餘的驗證,只有在這個頻率下運行最多驗證 - 以毫秒爲單位的時間。 如果連接到期進行驗證,但在此時間間隔內已被驗證,則不會再次進行驗證。默認值爲30000(30秒)。