【问题标题】:Query still running for django_migrations查询仍在运行 django_migrations
【发布时间】:2017-11-24 07:50:15
【问题描述】:

我正在开发一个 django 网络应用程序,我注意到一些奇怪的东西。 以下查询将在数据库中继续执行

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

这里的例子来自:select query_start,state_change,waiting,state,query from 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"

直到停止“运行服务器”

当前设置:

  • Django 1.11.2
  • PostgreSQL 9.2.17
  • 仅使用 Django ORM
  • 已应用所有迁移
  • 在 settings.py 中设置的 CONN_MAX_AGE

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

【问题讨论】:

  • 什么意思,查询还在运行?你是怎么确定的?首先你是如何运行它的?
  • 通过“pg_stat_activity”。查询仍处于“空闲”状态,连接在 10/15 小时后仍处于活动状态。

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


【解决方案1】:

从documentation,Django 使用持久连接:

[...] 每个线程都维护自己的连接

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

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

因此,默认情况下,runserver 会为每个传入请求创建一个线程,因此用于检查迁移的连接(在主线程中)永远不会被文档关闭:

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

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

【讨论】:

  • 感谢您的回复,但为什么如果我将“CONN_MAX_AGE”设置为 5 秒,连接仍然打开?
  • 我添加了关于为什么第一个连接与 runserver 保持连接的部分和解释
  • 感谢您的回复,我可能误解了 CONN_MAX_AGE 的工作原理。我可能会使用from django.db import close_old_connections close_old_connections() 通过自动任务管理连接的自动关闭。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多