一、问题现象

在使用flask_sqlalchemy的时候,几分钟未请求时,当再一次使用连接的时候,报如下错误:

[2021-12-02 09:48:44,009] ERROR in app: Exception on /xray/build [POST]
Traceback (most recent call last):File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2447, in wsgi_appresponse = self.full_dispatch_request()File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1952, in full_dispatch_requestrv = self.handle_user_exception(e)File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1821, in handle_user_exceptionreraise(exc_type, exc_value, tb)File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraiseraise valueFile "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1950, in full_dispatch_requestrv = self.dispatch_request()File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1936, in dispatch_requestreturn self.view_functions[rule.endpoint](**req.view_args)File "/app/controller/xrayServer.py", line 18, in xray_buildtask_info = XrayHandle().xray_build()File "/app/module/xrayHandle.py", line 60, in xray_buildXrayJobDao().init_xray_job(xray_job_dto)File "/app/dao/xrayJobDao.py", line 33, in init_xray_jobdb.session.commit()File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/scoping.py", line 163, in doreturn getattr(self.registry(), name)(*args, **kwargs)File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1046, in commitself.transaction.commit()File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 502, in commitself._assert_active(prepared_ok=True)File "/usr/local/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 296, in _assert_activecode="7s2a",
sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query')

二、问题分析

项目配置:flask_sqlalchemy自动回收连接的秒数,默认设置的是 -1,即永远不超时

SQLALCHEMY_POOL_RECYCLE =-1

而MySQL的wait_timeout默认是28800,也就是超过8小时的连接就会自动失效,而要连接的mysql通过查看发现是120秒

show variables like '%timeout%'


可以发现:

wait_timeout=120

三、问题原因

使用数据库连接池来获取连接,连接池里的连接可能会较长时间不关闭,等待被使用,这就与mysql连接超时机制起冲突,当连接池配置永不关闭或者关闭时间超过8小时就会出现Lost connection的问题

当超过8个小时没有新的数据库请求的时候,数据库连接就会断开,如果连接池的配置是用不关闭或者关闭时间超过8小时,这个时候连接池没有回收并且还认为连接池与数据库之间的连接还存在,就会继续连接,但是数据库连接断开了,就会报错数据库连接失败

四、解决方案

4.1 修改mysql的超时时间

修改mysql配置文件里wait_timeout参数,让这个时间大于连接池的回收时间

修改配置文件的方式不推荐

4.2 修改数据库连接池回收时间

修改数据库连接池的配置,数据库连接池都会带有一个参数:
回收时间(就是一定时间内不使用就会回收),修改这个参数的值,不要大于wait_timeout的值即可

在flask-SQLAlchemy中有个配置是SQLALCHEMY_POOL_RECYCLE(多久后对线程池中的线程进行一次连接的回收),如果这个值是-1代表永不回收
Flask-SQLALchemy自动设定这个值为-1,可以将这个值设置的小于wait_timeout参数的值即小于120即可

可以查看Flask-SQLAlchemy中的配置值

4.3 禁用SQLAlchemy数据库连接池

只需要在调用create_engine是指定连接池为NullPool,SQLAlchemy就会在执行 session.close()后立刻断开数据库连接
当然,如果session对象被析构但是没有被调用session.close(),则数据库连接不会被断开,直到程序终止

五、问题解决

使用方案4.2解决问题

SQLALCHEMY_POOL_RECYCLE = 100
SQLALCHEMY_POOL_TIMEOUT = 20

重启服务后自测长时间连接仍可正常使用,问题解决

【python】Flask-SQLAlchemy的Lost connection问题相关推荐

  1. Flask SQLAlchemy - 2013 Lost Connection

    Flask SQLAlchemy - 2013 Lost Connection 原因 mysql默认的连接超时时间为10s.由于路由字段没有加索引导致有时单条sql执行若超过10s,报了连接超时. 解 ...

  2. python flask sqlalchemy慢日志记录

    参考1:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_605days.html 参考2:https://gitee.com/Green-uni ...

  3. python学习之flask sqlalchemy介绍和使用 表操作增删查改

    flask sqlalchemy介绍和使用 表操作增删查改 内容详细 1 sqlalchemy介绍和快速使用 1.1 介绍 # SQLAlchemy是一个基于Python实现的ORM框架# djang ...

  4. python flask高级编程之restful_('Python Flask高级编程之RESTFul API前后端分离精讲',),全套视频教程学习资料通过百度云网盘下载...

    资源详情 r n t某课网好评度100%的Python Flask高级编程之RESTFul API前后端分离精讲 r n t t t第1章 随便聊聊 r n t t t聊聊Flask与Django,聊 ...

  5. python flask restful入门_Python Flask高级编程之RESTFul API前后端分离精讲

    第1章 随便聊聊 聊聊Flask与Django,聊聊代码的创造性1-1 Flask VS Django 1-2 课程更新维护说明 第2章 起步与红图 本章我们初始化项目,探讨与研究Flask的默认层级 ...

  6. flask sqlalchemy一对多关系详解

    下面的一对多关系以作者和文章为例: 首先创建一个文章表: class Post(db.Model): id = db.Column(db.Integer(),primary_key=True) tit ...

  7. python flask快速入门与进阶 百度云_Python Flask快速入门与进阶

    课程目录 1-1 Python Flask快速入门与进阶.mp4 2-1 windows环境安装开发环境 (上).mp4 2-2 windows环境安装开发环境 (下).mp4 2-3 配置开发环境. ...

  8. alchemy php,Flask SQLAlchemy

    在Flask Web应用程序中使用原始SQL对数据库执行CRUD操作可能很乏味. 相反,Python工具包SQLAlchemy是一个功能强大的OR映射器,为应用程序开发人员提供了SQL的全部功能和灵活 ...

  9. 【基于Python+Flask项目部署系列--03】开发测试环境配置-基于Ubuntu16.04

    一.开发测试环境介绍 前提已经部署完[基于Python+Flask项目部署系列--02]Ubuntu16.04服务器安装.建议部署2套环境:开发测试环境+生产环境. 这篇文章主要讲解测试环境如何配置p ...

  10. flask mysql 1366_2017-11-17 Python Flask Script+mysql环境设置

    [1.初级版] flask-scrpit安装. 使用flask-scrpit可以创建命令,并在Flask的应用上下文中执行,因为这样才能对Flask对象进行修改.Flask Script自带了一些默认 ...

最新文章

  1. face recognition[翻译][深度人脸识别:综述]
  2. jsp页面怎么调用的servlet
  3. tensorflow tf.matmul() (多维)矩阵相乘(多维矩阵乘法)
  4. ssh服务、密钥登陆配置
  5. setModel 的核心逻辑
  6. Redis学习第五课:Redis Set类型及操作
  7. 谈谈C#中的三个关键词new , virtual , override
  8. 设置网页打开默认全屏_微信公众号里的视频不能进行全屏播放的解决方法
  9. 【转】oracle 和 ' 特殊字符处理 ( like 'GAC/_%' escape ''; 这里面的 / 居然将 转义了 为什么?)...
  10. Bootstrap分页功能
  11. 使用Sonar管理代码质量(一)–简述与安装
  12. FastD 最佳实践二: 构建配置中心
  13. cad指示箭头快捷键命令_47个快捷键+50个CAD技巧助你玩转CAD
  14. 中国动漫及计算机专业好的大学排名,全国大学动画专业排名
  15. Cocos2d-x《雷电大战》(4)-策略模式实现不同子弹切换!!
  16. 哈佛结构和冯诺伊曼结构
  17. MFC——EDIT空间显示内容大小限制在32K,如何解除?
  18. gpu服务器压力测试方法,如何用Furmark对GPU进行压力测试?
  19. 《最强大脑》新科世界脑王:其实我是教小学数学的
  20. 设n是一个任意自然数,如果n的各位数字反向排列所得的自然数与n相等,则n称为回文数。从键盘输入一个5位数字,请编写程序判断这个数字是不是回文数

热门文章

  1. 基于Java的学生兼职平台设计与实现
  2. 【Android 教程系列第 23 篇】 java 方法之间怎么添加分割线
  3. web常用模块测试用例
  4. 【MQTT】SpringBoot整合MQTT(EMQX)
  5. fastjsonfastjson 1.2.24 反序列化导致任意命令执行
  6. 数字PCR简介(一)
  7. 什么是GPU,GPU怎么工作的,什么是图形的渲染,渲染怎么完成的。
  8. 道路交通车路协同信息服务通用技术要求
  9. java培训机构那个好点
  10. IT培训机构那些让人恶心的招生手法