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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:25:37