簡體   English   中英

Spring Rest控制器是單例嗎?

[英]Is Spring Rest Controllers Singleton?

我有一個示例 Spring Rest 應用程序。 我有幾個客戶端訪問 Spring Rest 應用程序中的 API。 API 根據我們使用的 MSSQL 數據庫檢查作業是否已啟動。 如果 DB 中的 Job 狀態處於啟動狀態,它將選擇記錄並將其狀態更新為 inprogress,並將 Job 的詳細信息作為對 API 的響應返回給 API,客戶端將基於此進行一些處理。

我們觀察到,不止一個客戶端正在獲取處於啟動狀態的同一個作業,並將其更新為進行中並將響應傳遞給客戶端。 因此,它最終就像多個客戶端正在處理相同的作業一樣。

我們試圖通過添加一個同步塊並封閉 DB 調用來解決這個問題,該調用在啟動狀態下選擇記錄並將其更新為進行中。 DB 調用駐留在服務層。 但仍然存在重復問題。

如果控制器和后續層(如服務層和 DAO 層)是單例的,那么當多個 API 調用命中 Web 應用程序時,同步的代碼塊應該一次由一個請求執行。 但這並不是我們實際看到的。

有人可以幫忙解決這個問題嗎?

實際上,Rest 控制器是線程安全的,這意味着它能夠處理每個唯一的 HTTP 請求。 此外,當您嘗試訪問 Rest Controller 時,它會在瀏覽器中創建一個單獨的會話 ID,您還可以使用開發者控制台進行檢查。 在這里,您嘗試訪問相同的數據庫並將狀態更改為進行中,因此下一個 api 有機會獲取上一個會話的詳細信息..所以嘗試修改 Rest API 而不每次都修改數據庫中的狀態,或者您可以做一些類似的事情,如果數據庫被一個 API 訪問,那么在第一個連接關閉之前,另一個 API 應該無法訪問數據庫。 希望這對你有用。

暫無
暫無

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

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