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 のような接続プールを使用することを推奨する理由です。Pymongo には接続プールが組み込まれているため、必要に応じて再接続します。

于 2012-09-07T20:52:23.587 に答える