Django django.db.utils.OperationalError: FATAL: 剩余的连接槽是为非复制超级用户连接保留的

Posted

技术标签:

【中文标题】Django django.db.utils.OperationalError: FATAL: 剩余的连接槽是为非复制超级用户连接保留的【英文标题】:Django django.db.utils.OperationalError: FATAL: remaining connection slots are reserved for non-replication superuser connections 【发布时间】:2020-04-26 07:57:23 【问题描述】:
  File "/usr/local/lib/python3.7/dist-packages/psycopg2/__init__.py", line 126, in connect    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError: FATAL:  remaining connection slots are reserved for non-replication superuser connections

根据 Postgres 文档,当 Django 与 Postgres DB 建立的连接数超过默认连接限制时,会发生此错误。

我想知道 Django 启动/打开大量与数据库的连接的原因可能是什么。 我想知道我们可以采取哪些最佳做法来防止它出现异常。 如何增加 Postgres 的默认连接限制?
#settings.py
DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'xxxxx',
        'USER': 'xxxxx',
        'PASSWORD':'xxxxx',
        'HOST':'localhost',
        'PORT':'5432',
    

【问题讨论】:

【参考方案1】:

我相信这是因为 Django 框架不进行数据库池化。查看 Django 文档 (https://docs.djangoproject.com/en/3.2/ref/databases/#transaction-pooling-and-server-side-cursors) 我可以找到用户 pgBouncer (http://www.pgbouncer.org/) 来处理这个问题的建议。

【讨论】:

Django 不会自行关闭连接?你建议我将CONN_MAX_AGE 的值设置为 60, 是的,这可以解决,但该值必须与 postgresql 配置的最大连接数相同或更低。您可以在 postgres 配置文件中检查和更改此值(postgresql.conf - 通常在 /var/lib/pgsql//data/ 文件夹中)

以上是关于Django django.db.utils.OperationalError: FATAL: 剩余的连接槽是为非复制超级用户连接保留的的主要内容,如果未能解决你的问题,请参考以下文章

Django - 学习目录

Django初识

Django之路

Django系列

django 错误

mac电脑安装django ,运行django报错解决