[英]Reconnecting to a postgres database after postgres restart from Java
我正在使用postgres 9.1, org.apache.commons.dbcp.BasicDataSource
(用於我的連接池)和Java 1.7。 當我重新啟動postgres服務器時,我得到了像org.postgresql.util.PSQLException: FATAL: terminating connection due to administrator command
這樣的異常org.postgresql.util.PSQLException: FATAL: terminating connection due to administrator command
。
如何使連接自動重新連接到重新啟動的數據庫?
根據文檔 ,DBCP有一個連接驗證查詢選項 - validationQuery
。 您可以將其設置為SELECT 1;
並且DBCP將在返回連接之前運行該測試。
也就是說,你的應用真的應該處理這種情況。 SQL查詢可能由於各種原因而失敗,您應該始終在具有時間退避和重試限制的重試循環中執行查詢,並使用一些邏輯來確定哪些異常在重試時可恢復,哪些不是(使用SQLState)為了那個原因)。
特別是,驗證受競爭條件的影響,您可以在其中進行以下事件排序:
要么
...因此,對於您的應用來說,保持適當的重試循環和良好的事務處理仍然很重要。
您可以從SQLException獲取SQLState: SQLException.getSQLState
。 PostgreSQL的代碼在PostgreSQL手冊中 。
在這種特殊情況下,PostgreSQL連接告訴您在創建連接后服務器已關閉。 DBCP連接池無法使用默認配置處理此情況。
即使您將validationQuery參數設置為SELECT 1之類的東西,也不會使用它,除非您還設置了至少一個testOnXXXX參數。
我通常將testOnCreate和testOnBorrow都設置為true 。
還要檢查DBCP的其他默認值(在org.apache.commons.pool2.impl.BaseObjectPoolConfig中),因為在我看來它們不適合生產環境。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.