You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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()  # 将连接放回池内,并非真正关闭
      

4. 事务未提交/回滚

mysql.connector默认autocommit为False,执行DML(INSERT/UPDATE/DELETE)操作后未提交或回滚,会导致连接被事务占用,无法复用。

  • 解决方案:
    • 执行DML操作后及时调用conn.commit();
    • 发生异常时调用conn.rollback();
    • 无需事务的场景,可直接开启自动提交:
      conn = mysql.connector.connect(..., autocommit=True)
      

5. 驱动版本存在bug

旧版本的mysql.connector可能存在内存泄漏或未修复的bug,在大量请求后触发故障。

  • 解决方案:
    • 更新到最新版本:pip install --upgrade mysql-connector-python

6. 应用代码内存泄漏

如果每次请求都创建大对象且未及时释放(比如全局变量累积数据),会导致内存耗尽引发故障。

  • 解决方案:
    • 检查代码中是否有未清理的全局变量、缓存对象;
    • 使用memory_profiler等工具定位内存泄漏点。

内容的提问来源于stack exchange,提问作者Skyde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:06:23