配置Django连接DigitalOcean托管PostgreSQL连接池遇连接槽报错
Django连接DigitalOcean PostgreSQL连接池配置问题解答
问题还原
尝试配置Django 5.2+连接DigitalOcean托管的PostgreSQL实例并启用连接池时,反复遇到以下错误:
OperationalError: connection failed: connection to server at "xxxxxxxxxxxx", port yyyy failed: FATAL: remaining connection slots are reserved for roles with the SUPERUSER attribute
当前使用的数据库配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': database_name, 'USER': database_user, 'PASSWORD': database_password, 'HOST': database_host, 'PORT': database_port, "OPTIONS": { 'sslmode': sslmode, 'pool': { 'min_size': 5, 'max_size': 150, 'timeout': 20, }, } } }
核心解答
1. 连接池配置语法是否正确?
是对的。Django 5.2+基于psycopg3实现了内置连接池支持,确实可以通过OPTIONS['pool']来配置连接池的min_size、max_size、timeout等参数,你的配置语法没有问题。
2. 错误原因及解决办法
错误的根源是连接池最大连接数设置超过了DigitalOcean PostgreSQL实例的可用连接配额:
- DigitalOcean托管的PostgreSQL实例有固定的最大连接数限制(不同规格实例配额不同,基础款可能只有几十到一百左右),你设置的
max_size=150远高于实例的实际可用连接数,导致连接池尝试创建过多连接,耗尽了普通用户的连接槽,剩下的连接槽仅留给超级用户,因此触发报错。
解决步骤:
- 先查清楚你的DO PostgreSQL实例的最大连接数:可以在DigitalOcean控制面板的数据库详情页查看配额,或者用超级用户登录数据库执行
SHOW max_connections;命令获取。 - 调整连接池参数:把
max_size设置为小于实例最大连接数,建议预留10-20个连接给超级用户和系统使用。比如实例最大连接数是100,就把max_size设为80;同时min_size不要过高,改成2-5即可,避免启动时就占用过多连接。 - 同步调整Django的并发设置:如果用Gunicorn这类WSGI服务器,worker数量×每个worker的线程数,不能超过连接池的
max_size,否则会导致连接池不够用,进而触发额外连接请求,再次耗尽配额。 - 确认用户权限:你的数据库用户不是超级用户(DO默认创建的用户都不是),所以绝对不能依赖预留的超级用户连接槽,必须严格控制连接数在普通用户的可用范围内。
修正后的配置示例
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': database_name, 'USER': database_user, 'PASSWORD': database_password, 'HOST': database_host, 'PORT': database_port, "OPTIONS": { 'sslmode': sslmode, 'pool': { 'min_size': 2, 'max_size': 80, # 根据你的实例实际配额调整 'timeout': 20, }, } } }
内容的提问来源于stack exchange,提问作者Medium Quora
相关产品推荐
相关产品推荐

