django.db.utils.OperationalError: (1040, 'Too many connections')
主要体现:就是请求不了后台,登录都登录不了。
原生django配置的mysql连接是没有连接池的功能,会导致mysql连接创建过多导致连接数超过了mysql服务允许的最大连接数。
python==3.8.10
django==3.2.7
django-db-connection-pool==1.0.7
1、1.0.7版本的网址
- Django>=1.8
- SQLAlchemy>=1.2.16
- PyMySQL>=0.9.3
- cx-Oracle>=6.4.1
- psycopg2>=2.8.6
3、settings.py配置
- DATABASES = {
- 'default': {
- 'ENGINE': 'dj_db_conn_pool.backends.mysql',
- 'NAME': 'your_database_name',
- 'USER': 'your_username',
- 'PASSWORD': 'your_password',
- 'HOST': 'your_host',
- 'PORT': 'your_port',
- 'POOL_OPTIONS': {
- 'max_connections': 50,
- },
- }
- }
-
- # 使用 django-db-connection-pool
- DATABASE_POOL_CLASS = 'django_db_geventpool.backends.mysql.base.DatabaseWrapper'
- DATABASE_POOL_ARGS = {
- 'POOL_SIZE': 10,
- 'MAX_OVERFLOW': 10,
- }
-
1、查看最大连接数
mysql> SHOW VARIABLES LIKE 'max_connections';

2、查看历史最大连接数
mysql> SHOW STATUS LIKE 'Max_used_connections';

3、修改允许的最大连接数
临时修改:
mysql> SET GLOBAL max_connections = 500;
永久修改:(vi /etc/mysql/mysql.conf.d/mysqld.cnf)
- [mysqld]
- max_connections = 1000
注意:一个连接大概需要2-3MB内存,在配置时,需要考虑服务器内存是否足够。
wait_timeout 参数:
作用: 定义了一个非交互连接在被自动关闭之前可以保持空闲的秒数。
推荐设置值:
对于 Web 应用程序,可以设置为 300 秒(5分钟)左右。
对于后台程序,可以根据具体场景适当延长,比如 1800 秒(30分钟)或 3600 秒(1小时)。
设置方法
- #临时生效:
- mysql> SET GLOBAL wait_timeout = 300;
-
-
- #永久生效:配置文件新增
- [mysqld]
- wait_timeout = 300
interactive_timeout 参数:
作用: 定义了一个交互式连接在被自动关闭之前可以保持空闲的秒数。
推荐设置值:
对于 Web 应用程序,可以设置为 28800 秒(8小时)左右。
对于需要长时间交互的应用程序,可以适当延长,比如 86400 秒(1天)。
设置方法
- #临时生效
- mysql> SET GLOBAL interactive_timeout = 28800;
-
-
- #永久生效:配置文件新增
- [mysqld]
- interactive_timeout = 28800