【问题标题】:Django pre-shutdown hook to close hanging pymongo connectionDjango pre-shutdown hook 关闭挂起的 pymongo 连接
【发布时间】:2012-08-04 13:17:20
【问题描述】:

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

【问题讨论】:

标签: django pymongo


【解决方案1】:

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

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

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

【讨论】:

  • 在每个请求结束时关闭连接会带来非常显着的性能损失。在下一个请求中,ReplicaSetConnection 必须重新发现整个副本集并连接到每个成员。很抱歉您遇到了这个问题,我们打算尽快修复它。但更好的解决方案是在 Django 中找到一些关闭钩子并修复关闭顺序,而不是惩罚每个请求。
  • 由于这是Django,我只是在处理manage.py中的命令后添加了一些清理代码。然而,这就是正在发生的事情。没有关闭钩子,AFAIK。
猜你喜欢
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
相关资源
最近更新 更多