我在 Django 应用程序中遇到问题,该应用程序在运行时超出了与 Postgres 的最大同时连接数 (100)Gunicorn
与异步eventlet
工人。当达到连接限制时,应用程序开始返回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
这些是已安装的软件包:
- 迪亚诺 v1.7
- 古尼康v19.3
- eventlet v0.17
- psycopg2 v2.6
当与 Gunicorn 工作线程一起运行时,Django 是否无法重用跨 HTTP 请求的连接?某种第三方数据库连接池是我唯一的选择吗?
23 年 3 月 15 日更新:似乎有问题CONN_MAX_AGE
和异步 Gunicorn 工作人员。连接确实是持久的,但从未在任何顺序请求中重用,如中所述这个帖子 https://serverfault.com/questions/635100/django-conn-max-age-persists-connections-but-doesnt-reuse-them-with-postgresq。环境CONN_MAX_AGE
to 0
请求结束时强制 Django 关闭连接,防止未使用的持久连接形成。
Django 没有数据库连接池。看看 PgBouncer。它是一个轻量级的连接池,易于设置和配置:https://wiki.postgresql.org/wiki/PgBouncer https://wiki.postgresql.org/wiki/PgBouncer
简而言之:您的 django 应用程序连接到 PgBouncer,并且它有一个与 Postgres 重用的连接池,因此永远不会超过最大连接限制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)