在 Web 应用程序中管理 MongoDB 对象生命周期
Managing MongoDB object lifetime in a web app
我有一个 RESTful 后端使用 mongodb 作为底层存储。我正在使用 C# 驱动程序。文档指出 mongo 自行管理其连接池。
问题是:要与 mongodb 通信,我需要以下实现的实例
IMongoClient
IMongoDatabase
IMongoCollection<T>
管理这些对象生命周期的最佳做法是什么?我可以将它们存储在每个服务器(应用程序域)的单例生活方式中,或者我可以根据请求继续创建它们。现在每个请求只有 IMongoCollection<T>
。
推荐的方法是持有一个 MongoClient
实例,并在需要时使用它来获取数据库和集合。
如果这对您的性能至关重要,您可以积极地缓存所有这些实例,但在大多数情况下,这是不必要的,因为所有这些类型都非常简单且创建起来成本低廉。例如,这是 GetCollection
方法:
public override IMongoCollection<TDocument> GetCollection<TDocument>(string name, MongoCollectionSettings settings)
{
Ensure.IsNotNullOrEmpty(name, "name");
settings = settings == null ?
new MongoCollectionSettings() :
settings.Clone();
settings.ApplyDefaultValues(_settings);
return new MongoCollectionImpl<TDocument>(this, new CollectionNamespace(_databaseNamespace, name), settings, _cluster, _operationExecutor);
}
除了一些参数处理和几个分配之外,这里实际上没有做任何事情。真正昂贵的是连接池,并且(如您所提到的)它由驱动程序在内部处理。
我有一个 RESTful 后端使用 mongodb 作为底层存储。我正在使用 C# 驱动程序。文档指出 mongo 自行管理其连接池。
问题是:要与 mongodb 通信,我需要以下实现的实例
IMongoClient
IMongoDatabase
IMongoCollection<T>
管理这些对象生命周期的最佳做法是什么?我可以将它们存储在每个服务器(应用程序域)的单例生活方式中,或者我可以根据请求继续创建它们。现在每个请求只有 IMongoCollection<T>
。
推荐的方法是持有一个 MongoClient
实例,并在需要时使用它来获取数据库和集合。
如果这对您的性能至关重要,您可以积极地缓存所有这些实例,但在大多数情况下,这是不必要的,因为所有这些类型都非常简单且创建起来成本低廉。例如,这是 GetCollection
方法:
public override IMongoCollection<TDocument> GetCollection<TDocument>(string name, MongoCollectionSettings settings)
{
Ensure.IsNotNullOrEmpty(name, "name");
settings = settings == null ?
new MongoCollectionSettings() :
settings.Clone();
settings.ApplyDefaultValues(_settings);
return new MongoCollectionImpl<TDocument>(this, new CollectionNamespace(_databaseNamespace, name), settings, _cluster, _operationExecutor);
}
除了一些参数处理和几个分配之外,这里实际上没有做任何事情。真正昂贵的是连接池,并且(如您所提到的)它由驱动程序在内部处理。