簡體   English   中英

注入類方法的讀/寫鎖

[英]Read/Write Locks on Methods of Injected Class

我目前正在開發一個 RESTful Web 服務,該服務從兩個不同的數據庫讀取和寫入。 我遇到的問題是處理調用我的服務然后在第一個完成寫入之前收到第二個調用的情況。 該服務讀取數據庫中的日期字段以確定它是否需要 INSERT 或 UPDATE,然后在所選操作中寫入該字段。 如果在第一個調用完成之前進行第二個調用,則日期字段將不會被寫入,因此我最終會得到兩個 INSERTS,而不是一個 INSERT 和一個 UPDATE。

我嘗試使用 java 和 groovy 中可用的並發 API,但到目前為止我還沒有讓它工作。 每次調用時,RESTful 服務都會查找模型類的新副本。 然后模型類通過依賴注入獲取 groovy 對象的新實例。 因此,我不能將 Lock 的實例放在任何地方,因為 RESTful 服務的每次調用都將處理模型和 groovy 的新實例。

誰能建議一個更好的方法來做到這一點? 任何幫助,將不勝感激。

更新

這是該服務的一些偽代碼

  1. 從數據庫 1 的表 A 中按 id 查找模型數據。
  2. 在數據庫 2 的表 B 中查找最近的條目,其中 id 與存儲在模型中的鍵 (dw_id) 匹配。
  3. 將結果的“開始日期”列與當前日期時間進行比較。

如果start_date 的“天” == 當天,

4a. 使用從模型獲得的數據對數據庫 2 的表 B 執行 UPDATE 查詢。

其他

5a. 對數據庫 2 的表 B 執行 UPDATE 查詢,將 end_date 列的值替換為昨天的日期,其中 id == dw_id。

5b. 在數據庫 2 的表 B 上執行 INSERT,使用模型中的數據,將 start_date 設置為今天的日期,將 end_date 設置為一個恆定的未來日期。

5c。 對數據庫 1 的表 A 執行更新,將模型的 dw_id 替換為由 5b 中的 INSERT 創建的條目的自動生成的 id。

更新 2

我最終實現了類似於jan-willem-gmelig-meyling提出的解決方案。 我在這里找到了一個很好的實現示例: https : //stackoverflow.com/a/27806218/32453 ,我能夠適應我的需求。

在 Java 中,您可以通過同步鎖定對象來完成此操作。 但是,這僅適用於在啟動數據庫事務之前獲取此鎖的情況。 否則,兩個並行線程將同時啟動一個數據庫事務並存在於隔離的數據庫版本中。 所以你大致得到:

private final static Object lock = new Object();

public void myResource() {
    synchronized (lock) {
        // begin tx, do work, end tx.
        // Other callee won't get here before first callee is finished
    }
}

然而,這確實打破了所有服務器無狀態約定。 在事務中實際鎖定數據庫表要好得多。 這可以防止另一個連接同時讀取和寫入同一個表。 您可以調查您的數據庫(或 ORM 庫,如果使用的話)支持哪些鎖定機制。 可以利用 JTA 等技術在服務器、服務或多個數據庫之間共享數據庫事務。

暫無
暫無

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

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