django_migrations 仍然查询 运行

Query still running for django_migrations

我正在开发一个 Django 网络应用程序,我注意到一些奇怪的事情。 以下查询将在 DB

中继续执行

SELECT "django_migrations"."app", "django_migrations"."name" FROM "django_migrations"

这里的示例来自:select query_start,state_change,等待,状态,来自 pg_stat_activity 的查询;

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"

当前设置:

为什么 Django 在查询执行后不关闭连接?

来自documentation,Django 使用持久连接:

[...] each thread maintains its own connection

runserver命令本身就是一个线程,SELECT "django_migrations"."app", "django_migrations"."name" FROM "django_migrations"只是表示在连接上进行的最后一次查询,一旦返回结果,状态就处于空闲状态。

如果您尝试在检查迁移后执行查询,例如在 wsgi 中,该请求将替换您看到的请求。

因此,运行服务器默认为每个传入请求创建一个线程,因此(在主线程中)为检查迁移而建立的连接永远不会关闭,由文档:

At the beginning of each request, Django closes the connection if it has reached its maximum age. If your database terminates idle connections after some time, you should set CONN_MAX_AGE to a lower value, so that Django doesn’t attempt to use a connection that has been terminated by the database server. (This problem may only affect very low traffic sites.)

如您所见,关闭是由 Postgres 或 Django 在下一个请求时完成的。因此,要么将 postgres 配置为终止空闲连接,要么可以在 runserver 上使用 --nothreading 来重用主线程建立的连接(警告:它会严重影响性能)。