c# - Cosmos SDK3 Container 可以是单例吗?
问题描述
我想减少 Azure Cosmos DB SQL-API 的负载,该 API 是通过依赖注入从 .NET Core Web API 调用的。
在 App Insights 中,我注意到对 Web API 的每次调用都会导致对 Cosmos 的 GetDatabase 和 GetCollection 调用,当 Cosmos 负载过重时,这可能需要 5 秒才能运行。
我做了CosmosClient
一个单例(例如这里的建议 - https://docs.microsoft.com/en-us/azure/cosmos-db/performance-tips-dotnet-sdk-v3-sql)
但是,我找不到任何关于Database
orContainer
对象是否也可以是单例的建议,因此这些是为对 Web API 的每个请求创建的。
我检查数据库和集合是否存在(例如,在此处遵循建议 - https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.cosmos.cosmosclient.getdatabase?view=azure-dotnet#备注和https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.cosmos.cosmosclient.getcontainer?view=azure-dotnet#remarks)
这意味着对于 Web API 的每个请求,都会运行以下代码
var databaseResponse = await this.cosmosClient.CreateDatabaseIfNotExistsAsync(
this.databaseConfiguration.DatabaseName,
throughput: this.databaseConfiguration.DatabaseLevelThroughput);
var database = databaseResponse.Database;
var containerResponse = await database.CreateContainerIfNotExistsAsync(containerId, partitionKey);
var container = containerResponse.Container;
我可以制作单例Database
并将Container
它们添加到要注入的 DICosmosClient
中,以减少 App Insights 中对 GetDatabase 和 GetCollection 的调用次数吗?
解决方案
CreateDatabaseIfNotExistsAsync
应该只调用一次,因为它只是数据库配置的设置步骤。
您最好创建一个 DbService 来持久化容器对象。并将 DbService 注入每个服务而不是 DB 客户端
推荐阅读
- javascript - 反应:输入更改的延迟
- android - java.lang.reflect.InvocationTargetException 在进行应用更新时
- java - 如果硒中不存在元素,如何编写代码[JAVA]
- django - 登录用户步骤的权限
- javascript - 如何防止文档使用javascript创建用户的新弹出窗口onclick事件
- sql - 一个简单的 sql 查询需要解释它是如何给出输出的?
- docusignapi - 在签署 pdf 时,它返回错误 UNABLE_TO_LOAD_DOCUMENT
- android - 在 Android Studio 中创建新模块时,如何禁用强制“项目需要转换为 androidx.* 依赖项”?
- sql - 如何在不使用 RANK() 或 rownums 函数的情况下在 SQL Server 中对表行进行分组排序?
- python-3.x - 错误地将一行添加到 txt 文件