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

时间:2012-08-07 13:47:33

标签: django pymongo

我在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 个答案:

答案 0 :(得分:1)

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

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

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