【问题标题】:MongoClient GetServer/GetDatabase best practise with ReplicaSetMongoClient GetServer/GetDatabase 与 ReplicaSet 的最佳实践
【发布时间】:2014-08-26 23:25:09
【问题描述】:

我应该何时致电MongoClient.GetServer() 和MongoServer.GetDatabase()?

以前我在启动时创建了一个 MongoDatabase 实例并将其用于所有操作。问题是当发生故障转移时,主节点变成不同的节点,导致实例不正确。

每次操作我都应该拨打myClient.GetServer().GetDatabase(myDatabaseName)吗?这可能是最正确的,尽管在故障转移期间某些调用无论如何都会失败。我很想为至少一组操作重用同一个数据库实例。

我主要担心的是频繁调用GetServer() 和GetDatabase() 会引入开销。我确信驱动程序会使用连接池并希望它会缓存实例,但我不知道它何时必须与服务器通信。

【问题讨论】:

    标签: c# mongodb


    【解决方案1】:

    您应该有一个 MongoClient 代表您与数据库的抽象连接,一个 GetServer() 调用来实例化具有给定选项集的 MongoServer 实例,以及一个 GetDatabase() 调用来实例化 MongoDatabase 实例.对于同一组选项,您不需要这些对象的多个实例。

    似乎这个问题的根本原因是故障转移处理。驱动程序应该发现整个副本集并自动连接到主副本。当发生故障转移时,在选举发生时有一段时间没有主节点,但驱动程序应该连接到新的主节点并恢复正常运行。您的客户端代码应该能够以适合您的应用程序的任何方式处理故障转移期间。故障转移不会使您的 MongoClient、MongoServer 或 MongoDatabase 实例失效。

    【讨论】:

    • 故障转移周期有多长? @wdberkeley
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2021-06-30
    • 2011-03-29
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多