3

我在 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 中进行连接池的正确方法吗?)

4

1 回答 1

2

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

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

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

于 2012-09-07T20:52:23.587 回答