2012-08-07 73 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