所以我一直在跟蹤一個或兩個現在發生在遠程服務器上的錯誤,我無法控制。我的代碼的來龍去脈是,我向我們的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(好像有人在評論中所建議的),我該如何堅持跨越他們這個交易?
感謝您的回覆。我會研究它。我如上所述,我已經使用tcpKeepAlive = true;這似乎沒有做任何事情(我假設,因爲我沒有改變我的本地機器上的操作系統設置,這是基於Windows)。至於超時,正如我所說,我故意讓我的本地機器更糟糕,以驗證它是一個超時問題。在實時服務器上,超時將是合理的。我目前沒有使用PGBouncer,我不熟悉使用連接池,但是我擔心它會如何與我的交易進行交互。 – Andy 2014-10-01 14:00:24