【问题标题】:What is a good value for CONN_MAX_AGE in Django?Django 中的 CONN_MAX_AGE 有什么好的价值?
【发布时间】:2013-11-25 01:53:39
【问题描述】:

Django 1.6 现在支持CONN_MAX_AGE to pool database connections

默认情况下,该值为 0(无池化)。这个选项的合理价值是什么?

【问题讨论】:

  • 0 是有道理的.. 为什么要在请求完成后保持连接打开,除非您明确需要它?
  • @karthikr 创建连接是一项昂贵的操作。这使您可以避免在每个请求上都创建连接。
  • @karthikr 因为建立连接的成本很高,而且您不想在每次查询时都重新建立连接。非常低效。

标签: django database-connection django-1.6


【解决方案1】:

此值取决于您网站的流量,流量越大,保持连接的秒数越多,我建议设置一个相对较小的值,例如60,并根据使用模式进行调整。



编辑(2018 年):

就像@jcyrss 指出的那样,这种方法有其怪癖,为了将来参考,我建议将池分发给 pgbouncer 之类的东西。

【讨论】:

  • 您是否建议在启用 pgbouncer 的情况下,根本不应该在设置中设置 CONN_MAX_AGE?
  • @HassanBaig 当然,一旦你有了 pgbouncer,从 Django 池中也没有任何好处。
  • 对于Django 3.2,在事务池模式下使用连接池(例如 PgBouncer)需要禁用该连接的服务器端游标。如果必须更改所有迭代器代码,我认为使用 pgbouncer 并不容易
【解决方案2】:

不是“流量越多,保持连接的秒数越多”那么简单。

这也取决于你如何运行 Django。

现在,一种在 gunicorn+greenlet(evenlet 或 gevent)中启动 Django 的流行方式。如果您将 CONN_MAX_AGE 设置为 60(在我的情况下甚至为 5),您可能会收到来自数据库服务器的“连接过多”的抱怨。

详情请看这里。

https://github.com/benoitc/gunicorn/issues/996

https://serverfault.com/questions/635100/django-conn-max-age-persists-connections-but-doesnt-reuse-them-with-postgresq

【讨论】:

  • 我们决定通过一个 pgpool-II 服务器连接到 postgres 服务器,使用 CONN_MAX_AGE != 0 如果你有足够的工作线程/线程,那么很快就会导致痛苦的超时。
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
相关资源
最近更新 更多