我在使用异步 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/