我正在开发一个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在查询执行后没有关闭连接?
答案 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
重用主线程建立的连接(警告:它会严重影响性能)。