代码之家  ›  专栏  ›  技术社区  ›  Brian Hicks

Django预关闭挂钩关闭挂起的pymongo连接

  •  3
  • Brian Hicks  · 技术社区  · 13 年前

    我在Django项目中使用pymongo,最近我开始遇到一个问题,在退出主Django进程时(即使是通过管理命令),pymongo连接将挂起,并且进程永远不会退出。显然,堆栈中有些地方出了问题,但目前最好的解决方案似乎是在Django退出之前显式关闭连接。

    那么:Django为此提供了一个预关闭信号或钩子吗?

    BTW:我的连接代码,以防你感兴趣。

    from django.conf import settings
    from pymongo import ReplicaSetConnection, ReadPreference
    
    conn = ReplicaSetConnection(
        hosts_or_uri=settings.MONGO['HOST'],
        replicaSet=settings.MONGO['REPLICASET'],
        safe=settings.MONGO.get('SAFE', False),
        journal=settings.MONGO.get('JOURNAL', False),
        read_preference=ReadPreference.PRIMARY
    )
    
    db = getattr(conn, settings.MONGO['DB'])
    

    (出于安全考虑,这是在pymongo中进行连接池的正确方法吗?)

    1 回复  |  直到 13 年前
        1
  •  2
  •   Samuel Clay    13 年前

    虽然这不会解决你的问题,但2012年7月,在对pymongo的承诺中引入了挂起: https://github.com/mongodb/mongo-python-driver/commit/1fe6029c5d78eed64fcb2a6d368d9cdf8756d2f4#commitcomment-1820334

    具体来说,它只影响ReplicaSetConnections。他们给出的答案是调用connection.close(),但正如你在问题中正确指出的那样,没有好的钩子来关闭连接。

    我相信您可以在每次请求结束时安全地关闭连接。Django已经为其到数据库的ORM连接做了这件事。这就是为什么他们建议使用像pgbouncer这样的连接池,所以重新连接到postgres是即时的。Pymongo内置了一个连接池,所以可以随意重新连接。