一、报错内容
django.db.utils.OperationalError: (1040, 'Too many connections')
主要体现:就是请求不了后台,登录都登录不了。
二、代码优化
原生django配置的mysql连接是没有连接池的功能,会导致mysql连接创建过多导致连接数超过了mysql服务允许的最大连接数。
2.1、使用django-db-connection-pool 实现池功能
python==3.8.10
django==3.2.7
django-db-connection-pool==1.0.7
2.2、django-db-connection-pool配置使用
1、1.0.7版本的网址
GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/altairbow/django-db-connection-pool/tree/1.0.7?init=initRepo2、依赖包
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,
}
三、mysql服务优化
3.1、配置最大连接数
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内存,在配置时,需要考虑服务器内存是否足够。
3.2、配置连接生命周期
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
-