gpt4 book ai didi

Django ORM 在 Postgres DB 上留下空闲连接

转载 作者:行者123 更新时间:2023-11-29 11:12:39 28 4
gpt4 key购买 nike

最近,由于数据库连接错误,我的 Django 应用程序经常崩溃:

OperationalError: FATAL:  sorry, too many clients already

当我进入应用程序数据库时,我看到确实有将近 100 个打开的连接,所有连接都具有相同的查询(由 Django ORM 执行)并且都在 idle 中。状态。

我一直在手动做SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle';但我对为什么会这样感到困惑。任何人都可以深入了解这里发生的事情吗?

我的 Django 数据库设置没有偏离默认值(我没有定义 CONN_MAX_AGE 或任何类似的东西)。

什么会导致这种情况?我没有做任何高级 Django 查询。这可以通过 Django 设置或一些 PostgreSQL 配置来解决吗?任何建议表示赞赏。

最佳答案

显然你没有断开连接。在查询完成后使用 db.close_connection() 会有所帮助。另外,如果我做对了 CONN_MAX_AGE 一些短值可能会有所帮助。并考虑使用一些 session 池,例如用于 django 连接的 pgbouncer。这样,如果您有太多连接,它将等待(或重用之前的连接,具体取决于配置)而不是因错误而中止执行...

更新:解释我为什么提出它

from docs

each thread maintains its own connection, your database must support at least as many simultaneous connections as you have worker threads.

所以如果你有比 postgres max_connections 更多的线程,你会得到提到的错误。如果 CONN_MAX_AGE 没有过去,每个线程都可以重用连接。您的设置为 0,因此连接应在查询完成后关闭,但您会看到 100 个空闲连接。所以他们没有关闭。大量的连接意味着它们也不会被重用(逻辑:如果你有 100 个并行查询,它们不会全部空闲,如果你有这么多,它们就不会被重用 - 打开新的)。所以我认为 django 不会像 promise 的那样关闭它们 - 所以 CONN_MAX_AGE 设置为 0 在你的代码中不起作用。所以我建议使用 db.close_connection() 强制断开连接并将 CONN_MAX_AGE 设置为一些小值可以改变行为。

关于Django ORM 在 Postgres DB 上留下空闲连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43262566/

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