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



我在 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.

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

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

最新更新