connectionrefusederror主因是mysql未监听tcp,需用127.0.0.1而非localhost验证;aiomysql.create_pool()必须await,连接池参数推荐minsize=5、maxsize=20,配合pool_recycle=3600防断连,所有i/o操作须await。

ConnectionRefusedError 总是第一个拦路虎
刚写完 aiomysql.create_pool() 就报 ConnectionRefusedError: [Errno 111] Connection refused,不是代码错,而是 MySQL 根本没在 TCP 上监听。localhost 在某些系统下会走 Unix socket,而 aiomysql 只走 TCP。
- 用命令行先验证:运行
mysql -h 127.0.0.1 -P 3306 -u root -p,别用localhost -
host参数必须填"127.0.0.1",不能是"localhost";port显式写出来,别依赖默认值 - 确保用户有远程权限:
CREATE USER 'test'@'%' IDENTIFIED BY 'pass'; GRANT ALL ON testdb.* TO 'test'@'%'; FLUSH PRIVILEGES; -
aiomysql.create_pool()返回协程,必须await,否则后续调用pool.acquire()会报AttributeError: 'coroutine' object has no attribute 'acquire'
连接池参数 minsize 和 maxsize 怎么设才不翻车
设太小,请求排队;设太大,MySQL 直接报 Too many connections。没有万能值,得看你的 QPS 和查询耗时。
- Web 场景(如 FastAPI)起步建议:
minsize=5、maxsize=20;观察SHOW STATUS LIKE 'Threads_connected'的峰值再调 - 短查询(毫秒级):
maxsize ≈ 并发请求数 × 1.5(留缓冲) - 长查询(含 JOIN/GROUP BY):
maxsize得压低,配合connect_timeout=5,防连接被占太久 - 务必加
pool_recycle=3600,否则 MySQL 的wait_timeout断连后,下次execute会抛OperationalError: (2013, "Lost connection")
执行 SQL 时漏掉 await cursor.execute() 就等于没执行
常见静默失败:写成 cursor.execute("INSERT ...", (x,)) 没加 await,数据根本没进库,也不报错——协程对象根本没调度。
- 所有数据库 I/O 方法都必须
await:cur.execute()、cur.fetchall()、cur.fetchone()、conn.commit() - 增删改后若
autocommit=False(默认),必须显式await conn.commit(),否则事务不落盘 - 游标和连接都不能跨协程复用;每次查询都要走完整链路:
async with pool.acquire() as conn:→async with conn.cursor() as cur: - 异常未捕获会导致连接卡住不归还;推荐用
async with自动管理生命周期,避免手动close()或release()遗漏
FastAPI 等异步框架里怎么安全初始化全局连接池
别在模块顶层直接 pool = aiomysql.create_pool(...),那只是个协程对象;也别在路由函数里每次新建池,开销太大。
- 在
@app.on_event("startup")里await create_pool(),赋给全局变量或应用 state - 关机时调
pool.close(); await pool.wait_closed(),否则进程可能不退出 - 不要混用
loop.run_until_complete()—— 在 FastAPI/Starlette 里会破坏事件循环,直接崩溃 - 连接池是线程不安全的,但 asyncio 协程间共享没问题;只要别把它塞进多线程环境(比如用
concurrent.futures.ThreadPoolExecutor调用)
实际部署时最容易忽略的是 pool_recycle 和 MySQL 的 wait_timeout 对齐,以及 autocommit 开关与 commit() 的配对。这两点不出问题时一切正常,一出就是静默失败或连接泄漏,排查起来特别费时间。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











