【问题标题】:Django exceeds maximum Postgres connectionsDjango 超过最大 Postgres 连接数
【发布时间】:2015-05-24 02:22:52
【问题描述】:

我遇到了一个 Django 应用程序的问题,该应用程序在通过 Gunicorn 与异步 eventlet 工作人员运行时超过了与 Postgres 的最大同时连接数 (100)。当达到连接限制时,应用程序开始返回500-errors,直到可以建立新连接。

这是我的数据库配置:

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
  • 小事件 v0.17
  • psycopg2 v2.6

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

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

【问题讨论】:

    标签: django postgresql psycopg2 gunicorn eventlet


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多