我有一種方法,其中一些資料庫操作通過一些 API 呼叫發生。這是 Spring 和 postgres DB 的場景。我們還在 postgres DB 中為空閑事務設定了屬性
idle_in_transaction_session_timeout = 10min
現在的問題是我有時會得到例外
org.postgresql.util.PSQLException:此連接已關閉。根本原因是致命的:由于空閑事務超時而終止連接
例如,我的代碼如下所示:
@Transactional(value = "transactionManagerDC")
public void Execute()
{
// 1. select from DB - took 2 min
// 2. call another API - took 10 min. <- here is when the postgres close my connection
// 3. select from DB - throws exception.
};
它的正確設計是什么?我們在 API 呼叫中使用第 1 步的輸出進行選擇,并在第 3 步中使用該 API 呼叫的輸出進行選擇。所以這三個步驟是相互依賴的。
uj5u.com熱心網友回復:
十分鐘是保持交易開放的非常長的時間。您的 RDBMS 服務器會自動斷開您的會話,回滾事務,因為它無法判斷事務是由互動式(命令列)用戶啟動的,該用戶然后出去吃午飯而沒有提交它,還是由像您這樣的長時間運行的任務啟動.
打開的事務可能會阻塞 RDBMS 的其他用戶,因此最好快速提交它們。
您最好的解決方案是重構您的應用程式代碼,以便在其他 API 呼叫的 10 分鐘回應后開始并快速提交事務。
如果不了解更多資訊,很難給你具體的建議。但是您可以在呼叫該慢速 API 之前在一行上設定某種status = "API call in progress"列,并在 API 呼叫完成后清除事務中的該狀態。
或者,您可以為該連接設定事務超時,以減少系統上的午餐風險。
SET idle_in_transaction_session_timeout = '15m';
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435137.html
標籤:春天 PostgreSQL 弹簧靴 交易 春季交易
