2012-08-07 75 views
1

我在Django项目中使用pymongo,最近我开始遇到一个问题,在退出主Django进程(即使通过管理命令)时, pymongo连接将挂起,并且该进程将永远不会退出。很明显,堆栈中某处出了问题,但现在最好的解决方案似乎是在Django退出之前明确关闭连接。Django预关机挂钩关闭挂pymongo连接

所以: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?正确的方式)

回答

1

虽然这不会解决您的问题,恒指在2012年7月推出了这一致力于pymongo:https://github.com/mongodb/mongo-python-driver/commit/1fe6029c5d78eed64fcb2a6d368d9cdf8756d2f4#commitcomment-1820334

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

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

+1

在每次请求结束时关闭连接会带来非常显着的性能损失。在下一个请求中,ReplicaSetConnection必须重新发现整个副本集并连接到每个成员。我很抱歉你遇到了这个问题,我们打算尽快解决它。但更好的解决方案是在Django中找到一些关闭钩子并修复关闭顺序,而不是惩罚每一个请求。 – 2012-09-08 00:19:55

+0

由于这是Django,我在处理'manage.py'中的命令后添加了一些清理代码。然而,这是发生了什么。没有关机挂钩,AFAIK。 – 2012-09-10 03:05:32