首页 > 解决方案 > 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

但是,我找不到任何关于DatabaseorContainer对象是否也可以是单例的建议,因此这些是为对 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 的调用次数吗?

标签: c#azure-cosmosdbazure-cosmosdb-sqlapi

解决方案


CreateDatabaseIfNotExistsAsync应该只调用一次,因为它只是数据库配置的设置步骤。

您最好创建一个 DbService 来持久化容器对象。并将 DbService 注入每个服务而不是 DB 客户端


推荐阅读