CreateDocumentCollectionIfNotExistsAsync 并非总是有效。

3

如果集合不存在,我想创建一个集合。

首先,我通过以下方式创建我的DocumentClient:

public DocumentClient CreateClient(ConnectionPolicy connectionPolicy = null)
{
   return new DocumentClient(new Uri(this.AccountEndpoint), this.AccountKey, connectionPolicy);
}

现在我有了我的文档客户端(我们称其为documentDbClient),我尝试使用CreateDocumentCollectionIfNotExistsAsync

var documentDbClient = dbConnection.CreateClient();

await documentDbClient.CreateDocumentCollectionIfNotExistsAsync(UriFactory.CreateDatabaseUri("mydatabase"),
            new DocumentCollection { Id = "testcollection" });

现在,我期望这会在名为mydatabase的数据库下创建一个名为testcollection的集合。然而,什么也没有发生。没有集合被创建,也没有抛出任何异常。我想也许只是速度慢,所以我等待了30分钟,回到门户网站看看我的集合是否已经创建......但它并没有被创建。出了什么问题?
更新:好吧,我已经发现,如果我更改我试图创建的集合的名称,它就可以工作了。我之前已经多次创建和删除了该集合,现在似乎Azure在90%的情况下无法创建它。

1
你是否一遍又一遍地创建和删除同一个文档,比如在单元测试的情况下?每分钟或每小时多次? - David Makogon
@DavidMakogon 是的,这就是我正在做的事情。 - pookie
@DavidMakogon 每小时多次会更准确。 - pookie
如果随机集合 ID 用于测试是可接受的,我们可以使用随机集合 ID 进行测试。 - Tom Sun - MSFT
2个回答

2
因此,当您反复创建和销毁集合时,很可能会遇到限流情况。以下是FAQ(同样适用于文档集合)中Table API部分的摘录:

检测到表的快速创建并进行了限流。我们建议您查看表的创建速率,并将其降低到每分钟不到5个。

当前的限流速率为每分钟5次创建。因此,对于单元测试场景,您需要解决此问题(例如保留一个集合,但在每次测试运行后仅清空其内容)。

注意:我已通知产品团队,限流提及只出现在Table API部分中,并请相应更新FAQ。


1
谢谢。但是,我绝对不是在每分钟创建5次集合。更像是每10分钟一次。也许对于集合来说限制更严格?此外,我隔了一天再试,使用的那个集合名称不再起作用。我可以通过门户创建它,但不能通过代码创建。不确定出了什么问题! - pookie

1
你应该在创建数据库和集合时添加.Wait(),这样可以等待两个任务完成。
_client.CreateDatabaseIfNotExistsAsync(new Database { Id = "dbName" }).Wait();

_client.CreateDocumentCollectionIfNotExistsAsync(UriFactory.CreateDatabaseUri("dbName"), new DocumentCollection { Id = "collectionName" }).Wait();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接