我在 Django 项目中使用 pymongo,最近我开始遇到一个问题,在退出主 Django 进程(即使通过管理命令)时,pymongo 连接将挂起,并且该进程永远不会退出。显然,堆栈中的某个地方出了问题,但目前最好的解决方案似乎是在 Django 退出之前显式关闭连接。
那么:Django 是否为此提供了预关闭信号或钩子?
顺便说一句:如果您有兴趣的话,我的连接代码。
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 中进行连接池的正确方法吗?)
虽然这不能解决您的问题,但在 2012 年 7 月对 pymongo 的提交中引入了挂起:https://github.com/mongodb/mongo-python-driver/commit/1fe6029c5d78eed64fcb2a6d368d9cdf8756d2f4#commitcomment-1820334 https://github.com/mongodb/mongo-python-driver/commit/1fe6029c5d78eed64fcb2a6d368d9cdf8756d2f4#commitcomment-1820334.
具体来说,它仅影响 ReplicaSetConnections。他们给出的答案是调用connection.close(),但是正如您在问题中正确指出的那样,没有好的钩子来关闭连接。
我相信您可以在每个请求结束时安全地关闭连接。 Django 已经为其与数据库的 ORM 连接执行了此操作。这就是为什么他们建议使用像 pgbouncer 这样的连接池,这样重新连接到 postgres 是即时的。 Pymongo内置了连接池,可以随意重新连接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)