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 1.11.2
- PostgreSQL 9.2.17
- 仅使用 Django ORM
- 已应用所有迁移
- CONN_MAX_AGE 设置为 settings.py
为什么 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
来重用主线程建立的连接(警告:它会严重影响性能)。
我正在开发一个 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 1.11.2
- PostgreSQL 9.2.17
- 仅使用 Django ORM
- 已应用所有迁移
- CONN_MAX_AGE 设置为 settings.py
为什么 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
来重用主线程建立的连接(警告:它会严重影响性能)。