使用mysql.connector执行约150次SQL请求后MySQL连接丢失问题
解决mysql.connector执行大量SQL请求后应用故障的问题
可能的原因及对应解决方案
1. 连接/游标资源泄漏(最常见)
每次执行SQL后未正确关闭游标或连接,导致系统资源被逐步耗尽,这是150次左右触发故障的典型原因。
- 解决方案:
- 优先用
with语句自动管理连接和游标,确保资源自动释放,无需手动关闭:import mysql.connector with mysql.connector.connect( host="你的主机地址", user="你的用户名", password="你的密码", database="目标数据库" ) as conn: with conn.cursor() as cursor: cursor.execute("SELECT * FROM 你的表名") result = cursor.fetchall() - 若必须手动管理,务必在
try...finally块中确保关闭操作执行,即使发生异常也不遗漏:conn = None cursor = None try: conn = mysql.connector.connect(host="你的主机地址", ...) cursor = conn.cursor() cursor.execute("INSERT INTO 你的表名 VALUES (...)") conn.commit() finally: if cursor: cursor.close() if conn: conn.close()
- 优先用
2. 结果集未完全读取
执行查询后如果只读取了部分结果(比如多次调用fetchone()但未读完),会占用连接资源,导致后续请求无法正常获取连接。
- 解决方案:
- 确保每次查询后读取完整结果集,或在关闭游标前调用
cursor.fetchall()清空剩余结果; - 若不需要剩余结果,直接关闭游标,或用
cursor.nextset()跳过剩余结果集(针对多结果集场景)。
- 确保每次查询后读取完整结果集,或在关闭游标前调用
3. MySQL连接数耗尽
MySQL默认最大连接数(max_connections)通常为151,刚好和你遇到的150次请求阈值匹配,说明可能每次请求都新建连接但未释放,导致达到上限。
- 解决方案:
- 查看当前MySQL连接数配置:执行
SHOW VARIABLES LIKE 'max_connections';; - 调整MySQL配置文件(my.cnf/my.ini)中的
max_connections参数,重启MySQL生效; - 改用连接池复用连接,避免频繁创建销毁连接:
from mysql.connector import pooling # 初始化连接池 connection_pool = mysql.connector.pooling.MySQLConnectionPool( pool_name="my_pool", pool_size=10, # 根据业务需求设置合理大小 host="你的主机地址", user="你的用户名", password="你的密码", database="目标数据库" ) # 从池内获取连接 conn = connection_pool.get_connection() try: with conn.cursor() as cursor: cursor.execute("UPDATE 你的表名 SET 字段=值 WHERE 条件") conn.commit() finally: conn.close() # 将连接放回池内,并非真正关闭
- 查看当前MySQL连接数配置:执行
4. 事务未提交/回滚
mysql.connector默认autocommit为False,执行DML(INSERT/UPDATE/DELETE)操作后未提交或回滚,会导致连接被事务占用,无法复用。
- 解决方案:
- 执行DML操作后及时调用
conn.commit(); - 发生异常时调用
conn.rollback(); - 无需事务的场景,可直接开启自动提交:
conn = mysql.connector.connect(..., autocommit=True)
- 执行DML操作后及时调用
5. 驱动版本存在bug
旧版本的mysql.connector可能存在内存泄漏或未修复的bug,在大量请求后触发故障。
- 解决方案:
- 更新到最新版本:
pip install --upgrade mysql-connector-python
- 更新到最新版本:
6. 应用代码内存泄漏
如果每次请求都创建大对象且未及时释放(比如全局变量累积数据),会导致内存耗尽引发故障。
- 解决方案:
- 检查代码中是否有未清理的全局变量、缓存对象;
- 使用
memory_profiler等工具定位内存泄漏点。
内容的提问来源于stack exchange,提问作者Skyde
相关产品推荐
相关产品推荐

