[英]How to handle JPA ObjectOptimisticLockException properly for multiple simultaneous transaction requests?
[英]how to handle multiple simultaneous user requests in an application
我正在用Java創建一個應用程序,其中數據庫中有一個表存儲可用的訪問插槽。
基本上,當用戶發出請求時,程序應該在表中找到一個具有打開(未使用)插槽的記錄。 在將用戶的數據發送給他之后,該插槽被標記為已使用,無法再使用。
我感到困惑的是,如何處理許多同時發生的請求...例如,如果同時有2個請求,那么這兩個請求是否都可能從表中拾取相同的插槽(記錄)? 我如何確保即使同時有多個請求,每個請求也會選擇一個唯一的未使用插槽,並且所有請求都將選擇不同的未使用插槽。
還有一點,我確實有很多插槽,但是重要的是兩個不同的請求都不能占用一個插槽。 但是,即使將來這種情況可能會改變,如果請求的數量急劇增加……所以我需要一種能夠以我所描述的方式處理大量請求的解決方案。
您要執行的操作稱為“ 連接池” (在此處使用tomcat的示例)。 解決上述問題的方法是使用數據庫允許的信號量系統,特別是事務。
首先,您讀取表並找到第一個未使用的記錄。 您將數字傳播回您的應用程序。 然后,您嘗試以獨占方式打開記錄(用於寫入)。 您再次檢查記錄是否仍未使用,如果是,則獲取該記錄的數據。 將數據保存到記錄中並釋放它。 但是,如果在打開該記錄進行寫入時突然使用了該記錄,則需要后退並再次尋找新記錄並重復該機制。
您將插槽提取請求放入同步隊列中。 這樣,您將確保插槽接收是FIFO(先進先出)。 你可以用這個
您正在使用哪個數據庫? MySQL具有SELECT ... FOR UDPATE
行鎖定支持。
嘗試這個,
使用ArrayBlockingQueue
進行線程安全訪問。...這將確保一次僅一個線程可以訪問記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.