【问题标题】:Too many connections to mongodb ReplicaSet?与 mongodb ReplicaSet 的连接太多?
【发布时间】:2020-04-09 19:51:03
【问题描述】:

我正在编写一个 Python 应用程序,以便在后端使用 pymongo 使用 Mongodb。

我创建了一个模型类来镜像插入数据库的文档 这是实际模型的一个简单示例:

if __name__ == '__main__':

    class MyApp(App):

        db_client = MongoClient(replicaset='erpRS').test

        def build(self):
            model = models.UserModel(name='NewUser', cpf='01234567890')
            print(model)
            model.save()
            model_from_db = models.UserModel.objects.find_one()
            print(model_from_db)

        def on_stop(self):
            self.db_client.close()

我的模型类(例如:UserModel)创建一个 Collection 实例作为类属性,用于 CRUD 操作。所以在上面的 sn-p 上,我创建了一个用户并将其保存到数据库中。然后我从数据库中获取以前保存的用户。当应用停止时,on_stop() 被调用并且 pymongo 客户端被调用并且它的连接被关闭。

此代码按预期工作。

但是监控数据库,我可以看到上面的片段,只有一个模型实例,因此,一个 Collection 实例和两个对 CRUD 操作的调用,打开了多达 6 个到数据库的连接。

进一步检查 mongodb 本身似乎保持了许多连接打开。该程序运行一次后,我的 3 节点 ReplicaSet 都在同一台机器上运行,打开了 19 个连接。

这是一个合理的行为吗?应该有这么多打开的连接吗?

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    MongoDB 有连接池。您不必太担心打开 19 个连接。一个连接的成本是节点上的 1mb 文件。

    您应该考虑的是重构代码并使用 DI 来传递 MongoClient 对象。

    每次实例化一个类时创建一个新的 MongoClient 和一个连接太昂贵了。

    【讨论】:

    • 只有一个 MongoClient 和 Collection 对象(数据库上的每个集合)被实例化,这就是为什么我认为这么多连接很奇怪。我意识到这远远低于连接限制,但对于我描述的情况来说,这似乎是一个很大的数字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2022-11-17
    • 2019-04-10
    相关资源
    最近更新 更多