Django、Ajax Long Polling、PostgreSQL:アイドルトランザクション
-
25-10-2019 - |
質問
Ajax Long Polling and Geventを使用して、チャットを実装しました。読むには、クライアントが更新ビューをajaxにし、gevent.event.waitを待機して更新を待ちます。
問題:リクエストの開始時にDjangoによって開かれたPostgreSQLトランザクション(セッション情報を取得するため)は、リクエストの終了まで閉じられません。そして、これらのアイドルトランザクションは多くの記憶を取ります。
リクエストを閉じることなくPostgreSQLトランザクションを閉じる最もクリーンな方法は何でしょうか?私は現在、request_finished信号を手動で送信しますが、ハックのように感じます。
解決
とにかく、あなたがそれをしている方法は、おそらくあなたのハックのフレームワーク内の最良の方法です。次のようなものを使用する代わりに、リクエスト応答プロセスにロングポールを靴を履こうとしている理由はありますか django-socketio?
他のヒント
ここを参照してください: https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_manially
@transaction.commit_manually
def yourview(request):
# do your db actions
transaction.commit()
または、コンテキストマネージャーを好む場合:
def yourview(request):
...
with transaction.commit_manually():
# do your db actions
...
また、PostgreSQL接続を開いているメモリの問題がある場合は、PGBouncerまたは存在するさまざまなGevent接続プールを使用してプールソリューションを見る必要があります。これを行うことで、かなりのパフォーマンスの向上が表示されるはずです。
所属していません StackOverflow