2012-02-15 5 views
7

ajax long pollingとGeventを使用してチャットを実装しました。 クライアントを読み込むには、更新ビューをajaxし、 を待ってください。更新を待つ。Django、Ajax long polling、Postgresql:idle transaction

問題: 要求の開始時に(セッション情報を取得するために)Djangoによって開かれたPostgreSQLトランザクションは、要求が終了するまで閉じられません。これらのアイドル状態のトランザクションは、大量のメモリを消費します。

要求を閉じることなく、PostgreSQLトランザクション を閉じる最もクリーンな方法は何でしょうか?私は現在 request_finishedシグナルを手動で送信していますが、ハックのように感じます。

答えて

2

あなたのやり方はおそらく、あなたのハックの枠組みの中でおそらく最良の方法です。 django-socketioのようなものを使用するのではなく、リクエスト・レスポンス・プロセスに長時間の投票を掛けようとしている理由はありますか? https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_manually

@transaction.commit_manually 
def yourview(request): 
    # do your db actions 
    transaction.commit() 

それとも、コンテキストマネージャ好む場合:

+0

gevent/gunicorn/apache(バックエンド)でnginx(フロントエンド)を使ってsocketioを動作させようとしましたが、長い時間がかかりませんでした。 Nginxでは、改造を頻繁にやりなおすことはできません。 それでも、私たちはsocketioのユーザーIDをdjangoのセッションIDにリンクできませんでしたので、ユーザー情報を取得できませんでした。あなたが完全なチュートリアルをお勧めするなら、それを見たいと思うでしょう。私たちが見つけたsocketio - chatチュートリアルのほとんどは、djangoのユーザ情報やフロントエンドを使わないでください。 – Ashe

+1

限りSocketIOを作るなどとDjango認証バックエンドは一緒に仕事:https://gist.github.com/fd8e9631368e447de702 –

+0

を正直に言うと、私たちは今、ロールバックされませんが、我々は決定的後でそれを維持します。ありがとうございました。 – Ashe

0

はこちらを参照してください。また

def yourview(request): 
    ... 
    with transaction.commit_manually(): 
     # do your db actions 
    ... 

を使用すると、PostgreSQLの接続を保持するメモリの問題を抱えている場合は、pgbouncerを使用してプーリング・ソリューションを探す必要があります開いたり、存在するさまざまなgevent接続プール。これを行うことでかなりのパフォーマンスの向上が見られるはずです。

+0

ロールバックを試してみましたが、コミットしてテストを行い、それが有効ならば検証します。あなたがお勧めするテクノを見てみましょう。答えをありがとう! – Ashe

+0

それは私たちのために働いていない。私はトランザクションがcommit_manuallyの中に開かれていて、以前にdjangoによって開かれたトランザクションは同じではない(あるいはわからないことがある)と思います。この技術を私たちの(醜い)ハックの代わりに使用すると、まだアイドル状態の接続があります。 – Ashe

関連する問題