查询仍在运行django_migrations

时间:2017-06-21 12:02:18

标签: python django postgresql django-database django-deployment

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

中执行
  

SELECT“django_migrations”。“app”,“django_migrations”。“name”FROM“django_migrations”

这里的例子来自:select query_start,state_change,waiting,state,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在查询执行后没有关闭连接?

1 个答案:

答案 0 :(得分:4)

documentation开始,Django使用持久连接:

  

[...]每个线程都保持自己的连接

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

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

因此,默认情况下,runserver会为每个传入请求创建一个线程,因此doc(

)永远不会关闭(在主线程中)用于检查迁移的连接
  

在每个请求开始时,Django会关闭连接   已达到最大年龄。如果数据库终止空闲   连接一段时间后,应将CONN_MAX_AGE设置为较低   值,以便Django不会尝试使用具有的连接   已被数据库服务器终止。 (这个问题可能只会影响   流量非常低的网站。)

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