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
相关产品推荐
相关产品推荐

