3

私はDjango Webアプリケーションを開発しています。 次のクエリは、DBdjango_migrationsのためにまだ実行中のクエリ

SELECT "django_migrations" の実行に滞在する "アプリ"、 "django_migrations" "名" から、ここで "django_migrations"

の例から:。。選択query_start 、state_change、待機中、状態、pg_stat_activityからの問い合わせ;唯一

  • すべてのマイグレーションがあっDjangoのORMを使用して

    • ジャンゴ1.11.2
    • のPostgreSQL 9.2.17
    • test6=> select query_start,state_change,waiting,state,query from pg_stat_activity; 
            query_start   |   state_change   | waiting | state |                 query 
      -------------------------------+-------------------------------+---------+--------+-------------------------------------------------------------------------------------------------- 
      2017-06-21 16:02:21.926337+02 | 2017-06-21 16:02:21.926402+02 | f  | idle | SELECT "django_migrations"."app", "django_migrations"."name" FROM "django_migrations" 
      

      は "のrunserver"

      現在の設定を停止刚性適用

    • CONN_MAX_AG Eはsettings.pyに設定されています

    なぜDjangoはクエリ実行後に接続を閉じないのですか? documentationから

  • +0

    クエリはまだ実行中ですが、どういう意味ですか?どのようにそれを決定していますか?どのように最初の場所でそれを実行していますか? "pg_stat_activity"経由で –

    +0

    クエリはまだ "アイドル"状態であり、接続はまだ10/15時間後に生きています。 – Mattia

    答えて

    3

    、Djangoは永続的な接続を使用する:

    [...]各スレッドは、独自の接続

    を維持runserverコマンドは、スレッド自体であり、そしてSELECT "django_migrations"."app", "django_migrations"."name" FROM "django_migrations"は単に表します接続で最後に実行されたクエリ。結果が返されると、状態はアイドル状態のままです。

    たとえば、wsgiで移行を確認した後にクエリを実行しようとすると、その要求が表示されます。

    したがって

    移行をチェックする(メインスレッドで)作られた接続はDOCによって、閉じられることはありませんので、デフォルトでのrunserverは、各着信要求のためのスレッドを作成:

    の開始時に各リクエストは、 が最大年齢に達した場合、Djangoは接続を閉じます。あなたのデータベースがしばらくしてアイドル 接続を終了した場合は、がデータベースサーバによって終了された接続をDjangoが使用しないようにCONN_MAX_AGEを の値に設定する必要があります。 (この問題は 非常に低いトラフィックの多いサイトに影響を与える可能性がある。)

    をあなたが読むことができるとおり、閉鎖が次の要求にはPostgresによって、またはジャンゴのいずれかによって行われます。したがって、ポストグルを設定してアイドル状態の接続を強制終了するか、runserverの--nothreadingを使用してメインスレッドの接続を再利用することができます(警告:パフォーマンスに大きな影響を与えます)。

    +0

    あなたの返事をありがとう、なぜ私は 'CONN_MAX_AGE'を5秒に設定してもまだ接続が開いていますか? – Mattia

    +0

    私は最初の接続がなぜrunserver – SebCorbin

    +0

    と一緒に保持されるのかに関する部分と説明を追加しましたあなたの返事をありがとう、おそらく私はCONN_MAX_AGEの仕組みを誤解しています。おそらく 'django.db import close_old_connections close_old_connections()'を使って、自動タスクとの接続の自動終了を管理します。ありがとう – Mattia

    関連する問題