PyMySQL连接超时根源是连接未复用与生命周期失控,而非单纯网络问题;需用DBUtils连接池配合手动ping验证、合理设置wait_timeout及max_connections等参数。

PyMySQL连接超时不是网络问题,而是连接没复用
直接用 pymysql.connect() 每次都新建 TCP 连接,频繁建立/断开会快速触发 MySQL 的 wait_timeout(默认 8 小时)或中间网络设备的空闲连接回收。更关键的是:你脚本里没关连接、没重用、没健康检查——超时只是表象,根源是连接生命周期失控。
DBUtils.PooledDB 不是“加个池就完事”,必须配对关闭和重试
DBUtils.PooledDB 提供的是简单连接池,但它**不自动检测失效连接**。如果 MySQL 主动断开了空闲连接(比如因 wait_timeout),下次从池里取出来的 Connection 对象可能已失效,一执行 cursor.execute() 就抛 OperationalError: (2013, 'Lost connection to MySQL server during query')。
- 必须在每次使用前做最小验证:比如
conn.ping(reconnect=True) - 不能依赖
pool.connection()返回就“一定可用”,要包裹try/except并在失败时主动pool.disconnect() -
maxconnections别设太高(如 >50),否则容易耗尽 MySQL 的max_connections(默认 151),反而引发(1040, 'Too many connections')
DBUtils + PyMySQL 的最小可靠配置长这样
以下不是示例,是生产环境可直接抄的骨架:
from dbutils.pooled_db import PooledDB import pymysql <p>pool = PooledDB( creator=pymysql, host='127.0.0.1', port=3306, user='root', password='xxx', database='mydb', charset='utf8mb4', autocommit=True,</p><h1>关键三参数</h1><pre class="brush:php;toolbar:false;">connect_timeout=3, # 建连阶段最多等 3 秒 read_timeout=5, # 查询响应最多等 5 秒 write_timeout=5, # 发送数据最多等 5 秒 # 连接池行为 maxconnections=10, # 总连接数上限,别超 MySQL 的 max_connections mincached=2, # 启动预热 2 个空闲连接 maxcached=5, # 最多缓存 5 个空闲连接 blocking=True, # 池满时阻塞等待(比报错更可控) ping=0, # 0=不自动 ping;实际要用时手动 ping
)
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
def get_conn(): conn = pool.connection() try: conn.ping(reconnect=True) # 主动探测,断了就重连 except: pool.disconnect() # 清掉这个坏连接 raise return conn
所有数据库操作必须用 get_conn() 获取连接,并确保 finally 或上下文管理器中调用 conn.close() ——注意:这里 close() 不是真的关 TCP,只是归还给池。
比连接池更容易被忽略的点:MySQL 服务端 timeout 设置
即使客户端全配对了,MySQL 自己也会杀掉空闲连接。查当前值:
SHOW VARIABLES LIKE 'wait_timeout'; SHOW VARIABLES LIKE 'interactive_timeout';
如果应用有长周期任务(比如批处理间隔 > 300 秒),建议把这两个值统一设为 600 或 1800,再写进 /etc/mysql/my.cnf 的 [mysqld] 段并重启 MySQL。否则,哪怕池里连着 10 个“活”连接,5 分钟后它们全变僵尸,第一次查询必炸。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










