我在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中进行连接池的正确方法吗?)
答案 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内置了一个连接池,因此可以随意重新连接。