2017-09-04 81 views
3

我嘗試了以下步驟ArangoDB併發問題

1.使用gatlin和arango java驅動程序我嘗試使用併發用戶創建一個集合。

2.我得到重複的名稱錯誤,因爲多個線程正試圖同時創建集合。

arango中是否有任何機制事務機制允許爲單個線程創建集合並在該進程中鎖定其他線程。

回答

2

以可能相同的名稱並行創建集合可能確實會導致重複的名稱錯誤。

與插入,刪除,更新和查詢文檔相反,集合的創建,刪除和重命名不能成爲ArangoDB事務的一部分。

因此,當並行創建集合時會有一些競爭,並且此時處理它們的唯一正確方法是檢查集合創建響應的返回代碼。答覆將清楚地表明集合創建是否成功或者是否有重複的名稱錯誤。應用程序可以通過中止或選擇其他名稱來適當地處理錯誤。

0

問題是,您從不同的線程執行多個數據庫請求(如創建一個集合)。 ArangoDB不知道你的客戶端線程。他們只是數據庫的其他客戶端。數據庫事務不會幫助你。你仍然會得到例外。

避免問題的最簡單方法是在線程中使用​​方法創建集合。在這種方法中,您在創建集合之前檢查集合是否已經存在。

同步方法一次只能在一個線程中執行。調用它的其他線程將被阻塞。所以第一個線程調用你的方法將創建集合,線程不會嘗試創建它。

public synchronized void createCollection(ArangoDatabase database, String collection) { 
    if (!database.getCollections().stream().map(c -> c.getName()).anyMatch(c -> c.equals(collection)) { 
    database.createCollection(collection); 
    } 
} 
0

使用嘗試捕捉method.If收集的創建失敗ArangoDB異常在創建收集固定它是thrown.Then在收集catch塊再次檢查並返回。