2014-10-01 79 views
2

所以我一直在跟蹤一個或兩個現在發生在遠程服務器上的錯誤,我無法控制。我的代碼的來龍去脈是,我向我們的UI團隊提供了一個jar文件,它包裝了postgres併爲用戶導入的數據提供存儲。由於多種原因,導入過程非常緩慢,其中一個原因是用戶正在導入不可預知的大量數據(我們無法真正減少這些數據)。這導致了很多超時問題。如何保持jdbc postgres alive

經過一些初步調查,我已經縮小到jdbc到postgres數據庫超時。我在我的本地測試設置上覆制了這個問題時遇到了很多麻煩,但最終設法通過將連接屬性的'socketTimeout'減少到10s(在連接上進行的每次調用之間有10秒以上)。

我現在的問題是,保持這個活着的最好方法是什麼?我已經將'tcpKeepAlive'設置爲true,但是這似乎沒有效果,我是否需要手動輪詢連接或什麼?從我讀過的內容來看,我假設輪詢是自動的,並由操作系統控制。如果這是真的,我真的不能控制運行環境中的操作系統設置,那麼處理這個問題的最好方法是什麼?

我正在考慮在每次使用連接時測試連接,如果超時,我會創建一個新連接。這是否是正確的行動方式,還是有更好的方法來保持連接的活躍?我剛看了這篇文章,其中有人建議你應該打開和關閉每個查詢的連接: When my app loses connection, how should I recover it?

在我的情況下,我有一系列順序插入發生在單個線程上,如果一個人失敗,他們都會失敗。要做到這一點我用交易:

m_Connection.setAutoCommit(false); 
m_TransactionSave = m_Connection.setSavepoint(); 

// Do something 

m_Connection.commit(); 
m_TransactionSave = null; 
m_Connection.setAutoCommit(true); 

如果我不繼續重新連接,或使用連接池像PGBouncer(好像有人在評論中所建議的),我該如何堅持跨越他們這個交易?

回答

3

到PostGres的JDBC連接可以配置保持活動設置。這個功能在這裏發生了一個問題:JDBC keep alive issue。此外,還有parameter help page

從那個音符,你可以添加以下爲JDBC連接的連接參數:

tcpKeepAlive=true; 

減小了socketTimeout應使事情變得更糟,而不是更好。 socketTimeout是連接等待數據到達時等待多長時間的一種度量,但它沒有。做更長,不會更短,這是我的本能。

您可能正在使用PGBouncer?如果沒有活動,該進程將主動終止服務器端的連接。

最後,如果您在Linux上運行,則可以使用:keep alive settings更改TCP保持活動設置。我相信Windows有類似的東西存在。

+0

感謝您的回覆。我會研究它。我如上所述,我已經使用tcpKeepAlive = true;這似乎沒有做任何事情(我假設,因爲我沒有改變我的本地機器上的操作系統設置,這是基於Windows)。至於超時,正如我所說,我故意讓我的本地機器更糟糕,以驗證它是一個超時問題。在實時服務器上,超時將是合理的。我目前沒有使用PGBouncer,我不熟悉使用連接池,但是我擔心它會如何與我的交易進行交互。 – Andy 2014-10-01 14:00:24