我尝试了以下步骤
1.使用gatlin和arango java驱动程序我尝试使用并发用户创建一个集合。
2.我发现重复的名称错误,因为多个线程正在尝试同时创建集合。
arango中是否有任何机制事务机制允许为单个线程创建集合并在该过程中锁定其他线程。
答案 0 :(得分:2)
并行创建具有相同名称的集合可能会导致重复的名称错误。
与插入,删除,更新和查询文档相反,集合的创建,删除和重命名不能成为ArangoDB事务的一部分。
因此,当并行创建集合时会有一些竞争,目前处理它们的唯一正确方法是检查集合创建响应的返回代码。响应将清楚地指示集合创建是否成功或者是否是重复的名称错误。然后,应用程序可以通过中止或选择其他名称来适当地处理错误。
答案 1 :(得分:0)
问题是您从不同的线程执行多个数据库请求(如创建集合)。 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);
}
}
答案 2 :(得分:0)
使用create collection方法中的try catch修复它。如果创建集合失败,则抛出ArangoDB异常。然后在catch块中再次检查集合并返回该集合。