我应该何时致电MongoClient.GetServer()
和MongoServer.GetDatabase()
?
以前我在启动时创建了一个MongoDatabase
实例,并将其用于所有操作。问题是当发生故障转移时,主节点变为不同的节点,使实例不正确。
我应该为每次操作调用myClient.GetServer().GetDatabase(myDatabaseName)
吗?这可能是最正确的,尽管有些调用在故障转移期间仍会失败。我很想为至少一组操作重用相同的数据库实例。
我主要担心的是经常调用GetServer()
和GetDatabase()
会引入开销。我确定驱动程序将使用连接池并希望它会对实例进行缓存,但我不知道它何时需要与服务器通信。
答案 0 :(得分:0)
您应该有一个MongoClient
表示与数据库的抽象连接,一个GetServer()
调用实例化具有给定选项集的MongoServer
实例,以及一个GetDatabase()
调用实例化MongoDatabase
实例。对于同一组选项,您不需要这些对象的多个实例。
这个问题的根本原因似乎是故障转移。驱动程序应该发现整个副本集并自动连接到主副本。发生故障转移时,有一段时间没有主要选项发生,但驱动程序应连接到新主服务器并恢复正常操作。您的客户端代码应该能够以适合您的应用程序的任何方式处理故障转移期。故障转移不会使您的MongoClient
,MongoServer
或MongoDatabase
个实例无效。