Django 超出最大 Postgres 连接数

标签 django postgresql psycopg2 gunicorn eventlet

我在使用异步 eventlet worker 运行 Gunicorn 时遇到 Django 应用程序超过 Postgres 最大同时连接数 (100) 的问题。当达到连接限制时,应用程序开始返回 500 错误,直到可以建立新连接为止。

这是我的数据库配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'django',
        'USER': 'django',
        'HOST': 'postgres',
        'PORT': 5432,
        'CONN_MAX_AGE': 60,
    }   
}   

这就是 Gunicorn 的启动方式:

gunicorn --bind 0.0.0.0:8080 --worker-class eventlet --workers 5 myapp.wsgi:application

这些是已安装的包:

  • djano v1.7
  • gunicorn v19.3
  • eventlet v0.17
  • psycopg2 v2.6

在与 Gunicorn worker 一起运行时,Django 是否无法重用跨 HTTP 请求的连接?某种第 3 方数据库连接池是我唯一的选择吗?

15-03-23 更新:CONN_MAX_AGE 和异步 Gunicorn worker 似乎有问题。连接确实是持久的,但从未在任何顺序请求中重复使用,如 this post 中所述.将 CONN_MAX_AGE 设置为 0 会强制 Django 在请求结束时关闭连接,以防止形成未使用的持久连接。

最佳答案

Django 没有数据库连接池。看看 PgBouncer。它是一个轻量级连接池,易于设置和配置:https://wiki.postgresql.org/wiki/PgBouncer

简而言之:您的 django 应用程序连接到 PgBouncer,它有一个到 Postgres 的连接池,它可以重用,因此永远不会超过最大连接限制。

关于Django 超出最大 Postgres 连接数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29170542/

相关文章:

python - Django 用户模型字段保存在哪里?

django - 如何将自定义域(启用 SSL)添加到 Django 中的用户配置文件?

python - django elasticsearch 在数据库有记录时给出空记录

将数据库从 sqlite 更改为 mysql 时,Python manage.py 迁移错误

postgresql - 抽象 PSQL 写查询

Spring 4 Hikari 连接池 ClassCastException

ruby - 插入违反外键约束

python - 如何使用具有正确字符编码的 python 读取 SQL 文件?

python - 我如何使用 Psycopg2 的 LoggingConnection?

python - 每个结果的多个子查询,如何更快?