Django 操作数据库 出现 too many connections错误 连接次数过多 的解决方法

通过CONN_MAX_AGE优化Django的数据库连接

https://www.cnblogs.com/aaron-agu/p/10380559.html

https://blog.csdn.net/cpxsxn/article/details/108492289

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # mysql数据库引擎,
        'NAME': 'Django_model',  # 数据库名字
        'USER': 'root',  # 用户名
        'PASSWORD': '123456',  # 密码
        'HOST': 'localhost',  # 主机
        'PORT': '3317',  # 端口
        'CONN_MAX_AGE': 10000,       --------------------主要说的是这个
        'OPTIONS': {  # 添加以下代码,取消外键检查
        "init_command": "SET foreign_key_checks = 0;",
    }
} }

 

这个参数的原理就是在每次创建完数据库连接之后,把连接放到一个Theard.local的实例中。
在request请求开始结束的时候,打算关闭连接时会判断是否超过CONN_MAX_AGE设置这个有效期。每次进行数据库请求的时候其实只是判断local中有没有已存在的连接,有则复用。
基于上述原因,Django中对于CONN_MAX_AGE的使用是有些限制的,使用不当,会适得其反。
因为保存的连接是基于线程局部变量的,因此如果你部署方式采用多线程,必须要注意保证你的最大线程数不会多余数据库能支持的最大连接数。
另外,如果使用开发模式运行程序(直接runserver的方式),建议不要设置CONN_MAX_AGE,因为这种情况下,每次请求都会创建一个Thread。
同时如果你设置了CONN_MAX_AGE,将会导致你创建大量的不可复用的持久的连接。

CONN_MAX_AGE设置多久:
CONN_MAX_AGE的时间怎么设置主要取决于数据库对空闲连接的管理,
比如你的MySQL设置了空闲1分钟就关闭连接,那你的CONN_MAX_AGE就不能大于一分钟,不过DBA已经习惯了程序中的线程池的概念,会在数据库中设置一个较大的值。

 

posted @ 2022-12-01 17:35  凯宾斯基  阅读(674)  评论(0)    收藏  举报