簡體   English   中英

線程未釋放 spring 引導中的 jdbc 連接

[英]Thread not releasing jdbc connection in spring boot

我們有一個 spring 啟動應用程序,其起點是 API。API 調用一個接口 ITradeService,它實現了 Callable。 ITradeService 有一個方法 service(),它依次調用 7 個方法,其中最后三個方法 method5() method6() 和 method7() 是獨立的。

在 SIT、UAT 環境中,由於某些原因,4 個節點中只有一個節點處於活動狀態,我的項目負責人要求我使用 4 個線程 - 1 個線程執行服務方法,其他 3 個線程執行上述 3 個方法。

我們的項目中有這三層

  • 控制器(休息API)
  • 服務 ITradeService
    貿易服務實施
    Type1TradeServiceImpl Type2TradeServiceImpl Type3TradeServiceImpl
  • DAO CommonDao Type1Dao Type2Dao Type3Dao

我們在每個 DAO 類中使用 JdbcTemplate。

在我們的 application.yaml 中,我們將 hikari 數據庫連接池配置為 2

當我嘗試使用 ThreadPoolTaskExecutor 為 4 個請求執行線程時,進程按預期工作但是當我發送第 5 個請求時它說

CannotCreateTransactionException 無法打開 JDBC 事務連接

我知道 4 個線程持有 JDBC 連接。 我應該讓線程釋放 JDBC 連接並將其發送回 hikari 連接池,或者我應該在任務完成后關閉線程

我應該如何以 spring 特定方式進行操作?

這將有助於理解為什么您覺得需要並行運行這三種方法。

在任何情況下,您都可以通過以下方式解決/緩解問題:

  • 設置適當的connectionTimeoutmaximumPoolSize以確保池自動縮放以滿足應用程序需求,或者其他線程在等待釋放連接時不會超時,和/或
  • 確保在這三個方法執行期間連接打開的時間盡可能短,例如,線程不在@Transactional方法中進行繁重的計算、文件訪問等。

關於第二個要點,如果你絕對需要原子操作,也許你可以使用樂觀鎖定(拉出你需要的信息並在那里完成工作單元,對數據的分離副本進行繁重工作,啟動另一個工作單元,看看數據是否同時發生變化,如果是,重試整個過程,否則只用你的副本更新數據)。

暫無
暫無

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

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