我正在使用带有C#驱动程序的MongoDB,并且想知道创建数据库连接的最有效但最安全的方法是什么。
根据Mongo DB C#驱动程序文档MongoClient, MongoServer, MongoDatabase, MongoCollection and MongoGridFS classes are thread safe。这是否意味着我可以拥有MongoClient
或MongoDatabase
的单例实例?
文档还说明a connection pool is used for MongoClient
,因此无论如何都要从MongoClient
类中抽象出对MongoDB的连接管理。
假设我的replicaset中有三个MongoDB实例;所以我根据这些实例的三个服务器地址创建MongoClient
和MongoDatabase
个对象。我可以为数据库和客户端对象创建静态单例并同时在多个请求中使用它们吗?如果其中一个实例死亡怎么办?如果我缓存Mongo对象,我怎样才能确保安全地处理这个场景?
答案 0 :(得分:1)
在我的项目中,我只使用单一的MongoClient,然后从MongoClient获取MongoServer和其他东西。
这是因为你说的,连接池是在MongoClient中,我绝对不希望有多个连接池。这是document所说的:
当您连接到副本集时,您仍将只使用一个副本集 MongoClient的实例,它表示整个副本集。 驱动程序自动查找副本集的所有成员 识别当前的主要。
实际上,MongoClient从1.7开始被添加到C#驱动程序,以表示整个副本集并处理故障转移,负载平衡的东西。因为MongoServer没有这种能力。因此,您不应该缓存MongoServer,因为一旦服务器脱机,您就无法知道它。
编辑:刚看了一下源代码。我可能犯了一个错误。 MongoClient不处理连接池。 MongoServer确实(至少在驱动程序1.7之前,尚未查看最新的驱动程序源)。这是有道理的,因为MongoServer代表一个真正的Mongo实例。并且一个连接池仅存储与该服务器的连接。