ArangoDB并发问题

ArangoDB并发问题,arangodb,Arangodb,我尝试了以下步骤 1.使用gatlin和arango java驱动程序,我尝试创建一个具有并发用户的集合 2.由于多个线程试图同时创建集合,我收到重复名称错误 arango中是否存在允许为单个线程创建集合并在该过程中锁定其他线程的机制事务机制。使用可能相同的名称并行创建集合可能确实会导致重复的名称错误 与插入、删除、更新和查询文档相反,集合的创建、删除和重命名不能成为ArangoDB事务的一部分 因此,在并行创建集合时会出现一些竞争,目前处理这些竞争的唯一正确方法是检查集合创建响应的返回代码。这

我尝试了以下步骤

1.使用gatlin和arango java驱动程序,我尝试创建一个具有并发用户的集合

2.由于多个线程试图同时创建集合,我收到重复名称错误


arango中是否存在允许为单个线程创建集合并在该过程中锁定其他线程的机制事务机制。

使用可能相同的名称并行创建集合可能确实会导致重复的名称错误

与插入、删除、更新和查询文档相反,集合的创建、删除和重命名不能成为ArangoDB事务的一部分


因此,在并行创建集合时会出现一些竞争,目前处理这些竞争的唯一正确方法是检查集合创建响应的返回代码。这些响应将清楚地指示集合创建是否成功,或者是否是重复的名称错误。然后,应用程序可以通过中止或选择其他名称来适当地处理错误。

问题在于,您从不同的线程执行多个数据库请求(如创建集合)。ArangoDB对您的客户端线程一无所知。它们只是数据库的其他客户端。数据库事务对您没有帮助。你仍然会遇到例外情况

避免问题的最简单方法是在线程中使用
synchronized
方法来创建集合。在该方法中,在创建集合之前检查集合是否已存在

同步方法一次只能在一个线程中执行。调用它的其他线程将被阻止。因此,调用方法的第一个线程将创建集合,后面的线程不会尝试创建它

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

使用创建集合方法中的try-catch修复了此问题。如果集合创建失败,将引发AngoDB异常。然后在catch块中再次检查集合并返回该异常