Python Flask微服务出现“MySQL Connection not available”错误的原因排查
"MySQL Connection not available" 错误的可能原因及修复方案
可能原因
- 全局单连接的线程安全问题:你代码中全局初始化的
db连接被所有请求共享,而Flask默认多线程运行,MySQL连接并非线程安全,多个请求同时操作这个连接会导致连接状态紊乱甚至直接失效。 - 连接闲置被服务器断开:MySQL服务器默认有
wait_timeout(通常8小时)设置,如果服务长时间无请求,全局连接会被服务器主动断开,后续请求再使用该连接就会抛出错误。 - 函数名重复导致路由冲突:产品列表接口的函数名也是
login,和登录接口函数名完全重复,会导致Flask路由注册时后者覆盖前者,请求/api/products时可能执行错误逻辑,间接引发异常。 - 游标与连接资源未正确管理:产品接口中重复创建游标,且所有接口都没有关闭游标、释放连接的逻辑,长期运行会导致连接资源耗尽或状态异常。
修复方案
1. 使用连接池替代全局单连接(推荐)
连接池会自动管理连接的创建、复用和销毁,避免多线程冲突和连接失效问题:
from mysql.connector import pooling # 初始化连接池 db_pool = pooling.MySQLConnectionPool( pool_name="product_pool", pool_size=10, # 根据并发量调整 host="localhost", user="user", password="pass", database="db" ) # 登录接口改造 @app.route('/api/login', methods=['POST']) def login(): db = db_pool.get_connection() cursor = db.cursor() try: formData = request.json sql = "SELECT * FROM users where username=%s and password=%s" cursor.execute(sql, (formData['user'], formData['pass'])) data = cursor.fetchone() if data is None: return {"result": "Invalid login"} return {"result": "Loggedin successfully! Redirecting...", "data": data} finally: cursor.close() db.close() # 产品接口改造(修改函数名) @app.route('/api/products', methods=['GET']) def get_products(): db = db_pool.get_connection() cursor = db.cursor() try: sql = "SELECT * FROM products" cursor.execute(sql) data = cursor.fetchall() if not data: return {"result": "No products found"} return {"result": "Products found", "data": data} finally: cursor.close() db.close()
2. 修复路由函数名冲突
将产品接口的函数名从login改为get_products,避免路由覆盖:
@app.route('/api/products', methods=['GET', 'POST']) def get_products(): # 接口逻辑
3. 添加连接重连机制(临时修复方案)
如果暂时不想用连接池,可在每次使用连接前检查状态,失效则重新连接:
def get_valid_connection(): global db try: if not db.is_connected(): db.reconnect() return db except: db = mysql.connector.connect( host="localhost", user="user", password="pass", database="db" ) return db # 接口中使用 @app.route('/api/products', methods=['GET']) def get_products(): db = get_valid_connection() cursor = db.cursor() try: # 业务逻辑 finally: cursor.close()
4. 规范资源管理
所有接口中创建的游标必须在使用后关闭,连接也需正确释放(连接池场景下是归还连接),避免资源泄漏。
内容的提问来源于stack exchange,提问作者Developers Staff
相关产品推荐
相关产品推荐

