我遇到一个Django应用程序的问题,当使用异步eventlet工作程序运行Gunicorn时,它超过了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工作人员一起运行时,Django无法在HTTP请求中重用连接吗?某种第三方数据库连接池是我唯一的选择吗?
更新15-03-23:CONN_MAX_AGE和异步Gunicorn工作人员似乎出现问题.连接确实是持久的,但从不在this post中提到的任何顺序请求中重用.将CONN_MAX_AGE设置为0会强制Django在请求结束时关闭连接,从而防止未使用的持久连接形成.
最佳答案 Django没有数据库连接池.看看PgBouncer.它是一个轻量级连接池,易于设置和配置:
https://wiki.postgresql.org/wiki/PgBouncer
简而言之:您的django应用程序连接到PgBouncer并且它有一个与Postgres连接的池,它重用它,因此永远不会超过最大连接限制.