asp.net-core - Asp.net core 3 应用程序加载 cosmos db 查询缓慢
问题描述
我有一个非常简单的 Cosmos DB 查询,它是从 asp.net core 3 Razor Pages 应用程序中进行的。我在 Azure 的数据资源管理器中进行的相同查询将在 0.02 毫秒内返回结果。当我通过应用程序运行它时,设置秒表以查看通话的持续时间,它可以是 400 毫秒到 2000 毫秒之间的任何时间。
QueryDefinition queryDefinition = new QueryDefinition("SELECT * FROM Cache where Cache.JoinCode = @jc").WithParameter("@jc", JoinCode);
var query = _container.GetItemQueryIterator<HostCache>(queryDefinition);
List<HostCache> results = new List<HostCache>();
while (query.HasMoreResults)
{
var response = await query.ReadNextAsync();
results.AddRange(response.ToList());
}
return results.FirstOrDefault();
长期运行的请求是await query.ReadNextAsync();
. 我能做些什么来加快速度吗?也许我做错了?
解决方案
首先,我强烈建议您(或使用 Cosmos DB .Net SDK 的任何人)在 Cosmos DB Youtube 频道上观看此视频:https ://www.youtube.com/watch?v=McZIQhZpvew 。这提供了有关使用此 SDK 时要遵循的最佳实践的非常有用的信息。
该视频将解释为什么第一个请求需要这么多时间以及如何加快速度。
总结这个答案的目的,创建 Cosmos 客户端实例(使用“直接”连接模式)并没有多大作用。当您向该客户端发出第一个请求时,会发生初始化,此时 SDK 会发出一些网络请求以获取有关建立“直接”(TCP)连接的必要信息。这就是为什么第一个请求需要花费大量时间。在第一次请求之后,信息由 SDK 缓存,因此后续请求比第一次请求花费的时间要少得多。
要在创建 Cosmos 客户端时进行初始化,您需要使用CreateAndInitializeAsync
CosmosClient 的方法。这是来自文档页面的相同示例:
using Microsoft.Azure.Cosmos;
List<(string, string)> containersToInitialize = new List<(string, string)>
{ ("DatabaseName1", "ContainerName1"), ("DatabaseName2", "ContainerName2") };
CosmosClient cosmosClient = await CosmosClient.CreateAndInitializeAsync("connection-string-from-portal",
containersToInitialize)
推荐阅读
- c++ - 我可以将 std::move 与不提供移动构造函数的类一起使用吗?
- cuda - 如何检查 CUDA 中的整数算术溢出?
- android - Android 布局 - TableRow 的间接子代作为单元格
- javascript - 如何在赛普拉斯断言中计算 DOM 元素
- mysql - system.data.dll 中发生系统“ArgumentException”
- python - Pandas 中是否有一个很好的捷径可以从一阶差分时间序列中恢复真实值?
- c# - If else formatting Visual Studio not indenting correctly
- javascript - 在 Salesforce Marketing Cloud 中使用 AMPScript 进行 SMS 个性化
- actions-on-google - Actions on Google 播放媒体时不等待应答
- c - 如何使用 __cpuid 检查 AES-NI 支持?