gpt4 book ai didi

python - 查询仍在为 django_migrations 运行

转载 作者:太空宇宙 更新时间:2023-11-03 14:53:17 26 4
gpt4 key购买 nike

我正在开发一个 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"

直到停止“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 来重用主线程建立的连接(警告:它会严重影响性能)。

关于python - 查询仍在为 django_migrations 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44675570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com