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

2024-01-26

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

OperationalError: FATAL:  sorry, too many clients already

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

我一直在手动做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一些短期值可能会有所帮助。并考虑使用一些会话池,例如用于 django 连接的 pgbouncer。这样,如果您有太多连接,它将等待(或重用以前的连接,具体取决于配置),而不是因错误而中止执行...

update: 解释一下我为什么提出这个建议

来自文档 https://docs.djangoproject.com/en/1.11/ref/databases/#persistent-connections

每个线程维护自己的连接,你的数据库必须支持 至少与工作线程一样多的并发连接数。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django ORM 在 Postgres DB 上留下空闲连接 的相关文章

随机推荐