簡體   English   中英

postgres從Java重啟后重新連接到postgres數據庫

[英]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)為了那個原因)。

特別是,驗證受競爭條件的影響,您可以在其中進行以下事件排序:

  1. 驗證
  2. 傳遞給app的連接
  3. 服務器關閉
  4. App運行第一個聲明

要么

  1. 驗證
  2. 傳遞給app的連接
  3. App運行第一個語句,打開一個事務
  4. 服務器關閉
  5. App運行第二個聲明

...因此,對於您的應用來說,保持適當的重試循環和良好的事務處理仍然很重要。

您可以從SQLException獲取SQLState: SQLException.getSQLState PostgreSQL的代碼在PostgreSQL手冊中

在這種特殊情況下,PostgreSQL連接告訴您在創建連接后服務器已關閉。 DBCP連接池無法使用默認配置處理此情況。

即使您將validationQuery參數設置為SELECT 1之類的東西,也不會使用它,除非您還設置了至少一個testOnXXXX參數。

我通常將testOnCreatetestOnBorrow都設置為true

還要檢查DBCP的其他默認值(在org.apache.commons.pool2.impl.BaseObjectPoolConfig中),因為在我看來它們不適合生產環境。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM