在使用CosmosDB SDK v3解决问题一段时间后,在参考文档中发现客户端应该被声明为私有和静态的,我遇到了严重的套接字和缓冲区故障。
我声明如下:
CosmosClient cosmosClient = new CosmosClient(cosmosDBEndpointUrl, cosmosDBPrimaryKey, new CosmosClientOptions() { AllowBulkExecution = false });所以我把它改成了这个
private static CosmosClient cosmosClient = new CosmosClient(cosmosDBEndpointUrl, cosmosDBPrimaryKey, new CosmosClientOptions() { AllowBulkExecution = false });到目前为止,这似乎已经解决了这个问题。
有谁能给我解释一下为什么这样简单地解决了我的问题?它是否确保将一个客户端重新用于所有连接?否则我就看不出这有什么区别了?
发布于 2020-03-19 20:56:09
正如您所说的,静态确保应用程序中只有一个实例,这是CosmosClient的最佳实践,限制其他资源(如HttpClient )的使用也很重要。
它不需要是私人的。
下面是一个代码示例,它将使用延迟加载来初始化您的CosmosClient (或者在本例中是DocumentClient),这将使您的应用程序启动速度稍微快一些。
private static Lazy<DocumentClient> lazyClient = new Lazy<DocumentClient>(InitializeDocumentClient);
private static DocumentClient documentClient => lazyClient.Value;
private static DocumentClient InitializeDocumentClient()
{
var endpointUrl = Environment.GetEnvironmentVariable("CosmosEndpoint", EnvironmentVariableTarget.Process);
var authorizationKey = Environment.GetEnvironmentVariable("CosmosAuthorizationKey", EnvironmentVariableTarget.Process);
return new DocumentClient(new Uri(endpointUrl), authorizationKey, ConnectionPolicy);
}
public static DocumentClient DocumentClient { get { return documentClient; } }发布于 2020-03-11 01:25:46
来自文档
CosmosClient是线程安全的.它建议在应用程序的每个生命期维护一个CosmosClient实例,从而实现高效的连接管理和性能。请参阅性能指南。
https://stackoverflow.com/questions/60628030
复制相似问题