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

Flask-SQLAlchemy查询时丢失MariaDB连接,排查SO方案仍未解决

查询期间与服务器失去连接问题排查

已查阅以下StackOverflow帖子但问题仍未解决:

  • SQLAlchemy/MySQL Lost connection to MySQL server during query
  • Periodic "Lost connection to MySQL server during query" after Dockerizing Flask Web App
  • Flask SQLAlchemy - 2013 Lost Connection
  • How to disable SQLAlchemy caching?
  • How to avoid caching in sqlalchemy?
  • How to disable caching correctly in Sqlalchemy orm session?

遇到查询期间与服务器失去连接错误,以下是Flask项目__init__.py文件内容:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import func, exc
from flask_login import UserMixin
import time

db = SQLAlchemy()

class users(db.Model, UserMixin):
    id    = db.Column(db.Integer,     nullable=False, unique=True, primary_key=True) 
    email = db.Column(db.String(100), nullable=False, unique=True)

def app():
    app = Flask(__name__)

    app.config['SQLALCHEMY_DATABASE_URI'] = "mariadb+mariadbconnector://serviceid:itsasecret@ec2-1-2-3-4.compute-1.amazonaws.com:3306/mytable"
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    app.config['SQLALCHEMY_POOL_SIZE'] = 100
    app.config['SQLALCHEMY_POOL_RECYCLE'] = 30
    app.config['SQLALCHEMY_POOL_TIMEOUT'] = 30
    app.config['SQLALCHEMY_POOL_PRE_PING'] = True
    app.config["SQLALCHEMY_ECHO"] = True
    app.config["SQLALCHEMY_RECORD_QUERIES"] = True

    db.init_app(app)    
    with app.app_context():
        db.create_all()

        data = users.query.filter(users.email.ilike('john.doe@example.com')).first()
        db.session.close()
        db.session.flush()
        db.session.expire_all()

        time.sleep(60)

        data = users.query.filter(users.email.ilike('john.doe@example.com')).first()
        db.session.close()
        db.session.flush()
        db.session.expire_all()
 
    return app            

触发条件:设置time.sleep(59)或更短时间时无问题;设置time.sleep(60)或更长时间时触发错误,推测与MariaDB的60秒超时设置有关。MariaDB相关超时参数如下:

[ec2-user@ip-172-31-80-56 ~]$ sudo docker exec mariadb mysql -e "SHOW SESSION VARIABLES LIKE '%timeout%'" | grep 60
net_write_timeout       60
slave_net_timeout       60
thread_pool_idle_timeout        60

[ec2-user@ip-172-31-80-56 ~]$ sudo docker exec mariadb mysql -e "SHOW GLOBAL VARIABLES LIKE '%timeout%'" | grep 60
net_write_timeout       60
slave_net_timeout       60
thread_pool_idle_timeout        60

控制台输出:

2023-08-12 05:17:46,349 INFO sqlalchemy.engine.Engine SELECT DATABASE()
2023-08-12 05:17:46,350 INFO sqlalchemy.engine.Engine [raw sql] ()
2023-08-12 05:17:46,558 INFO sqlalchemy.engine.Engine SELECT @@sql_mode
2023-08-12 05:17:46,559 INFO sqlalchemy.engine.Engine [raw sql] ()
2023-08-12 05:17:46,660 INFO sqlalchemy.engine.Engine SELECT @@lower_case_table_names
2023-08-12 05:17:46,661 INFO sqlalchemy.engine.Engine [raw sql] ()
2023-08-12 05:17:46,867 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-08-12 05:17:46,869 INFO sqlalchemy.engine.Engine SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = ? AND table_name = ?
2023-08-12 05:17:46,870 INFO sqlalchemy.engine.Engine [generated in 0.00112s] ('mytable','users')
2023-08-12 05:17:46,968 INFO sqlalchemy.engine.Engine COMMIT
2023-08-12 05:17:47,178 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-08-12 05:17:47,186 INFO sqlalchemy.engine.Engine SELECT users.id AS users_id, users.email AS users_email FROM users WHERE lower (users.email) LIKE lower (?) LIMIT ?
2023-08-12 05:17:47,188 INFO sqlalchemy.engine.Engine [generated in 0.00224s] ('john.doe@example.com', 1)
2023-08-12 05:17:47,278 INFO sqlalchemy.engine.Engine ROLLBACK
time.sleep(60) here
2023-08-12 05:18:48,484 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-08-12 05:18:48,486 INFO sqlalchemy.engine.Engine SELECT users.id AS users_id, users.email AS users_email FROM users WHERE lower (users.email) LIKE lower (?) LIMIT ?
2023-08-12 05:18:48,491 INFO sqlalchemy.engine.Engine [cached since 61.31s ago] ('john.doe@example.com', 1)
2023-08-12 05:18:48,499 INFO sqlalchemy.pool.impl.QueuePool Invalidate connection <mariadb.connection connected to 'ec2-107-22-51-98.compute-1.amazonaws.com' at 0000023778900830> (reason: InterfaceError:Lost connection to server during query)
Traceback (most recent call last):
mariadb.InterfaceError: Lost connection to server during query

另外,尽管调用了db.session.close()、db.session.flush()和db.session.expire_all(),仍出现SQLAlchemy缓存日志,不确定是否与此问题相关:

2023-08-12 05:18:48,491 INFO sqlalchemy.engine.Engine [cached since 61.31s ago] ('john.doe@example.com', 1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:25:59