分析解决Python中sqlalchemy数据库连接池QueuePool异常

作者:CXYhh121 时间:2024-01-16 12:18:19 

数据库相关错误的解决办法

错误一:数据库连接池超过限制

SqlAlchemy QueuePool limit overflow

分析解决Python中sqlalchemy数据库连接池QueuePool异常

造成连接数超过数据库连接池的限制,有两方面的原因,第一个是由于数据库连接池数比较小,因此当连接数稍微增加的时候就会超过限制,另一个原因就是在使用完数据库连接后未能即使释放,最后造成数据连接数持续增加从而超出数据库连接池的限制,所以我们也可以从这两个方面来解决这个问题,但是根本上还是得解决后一个原因造成的问题,不然即便是将数据库连接池增大时间长之后也还是会出现相同的问题。

解决办法

  • 方法一

python和java都有finally关键字,在执行完所有代码之后再执行finally处的代码,有这个关键字相助就让我们能够很好的解决这个问题,只要在进行完所有的数据库操作之后将数据库连接关闭即可。


connection = DBSession.connection()
try:
   rescount = connection.execute("select resource_id,count(resource_id) as total FROM resourcestats")
   #do something
finally:
   connection.close()
  • 方法二

学过python的小可爱们都知道python有个很好用的东西叫做装饰器,因为方式的解决办法在针对一个函数操作数据库的时候还是比较好用的,但是在一个项目中绝对是不止一个操作数据的函数的,如果在每个操作数据库函数的后方都加上finally关键值的话,会显得很累赘不说,如果有些函数忘记加了也会很麻烦,这个时候装饰器就显得很有用了,只要在函数上加上一个关闭数据库连接的装饰器,就能够在所有数据库操作结束之后关闭数据库连接

如果有不了解python的装饰器的可以看一下这个文章:理解Python 装饰器看这一篇就够了


def shutdown_session(func):
   @wraps(func)
   def wrapper(*args, **kwargs):
       result, msg = func(*args, **kwargs)
       db.session.close()
       db.session.rollback()
       return result, msg
   return wrapper

在数据库操作函数前加上上面的装饰器即可解决对应的问题

错误二:数据库事务未回滚

分析解决Python中sqlalchemy数据库连接池QueuePool异常

查询报错:sqlalchemy.exc.InvalidRequestError: Can't reconnect until invalid transaction is rolled back
原因是:连接断开后,事务没有回滚,残留的锁导致后续的查询报错.sqlalchemy对每一个查询和插入等操作都是一个事务。


# main.py
from models import OrderInfo
from sqlalchemy.exc import InvalidRequestError
try:
   order = OrderInfo.query.filter_by(task_id=user_dict.get('task_id')).first()
   order.status = 'COMPLETE'
   db.session.commit()
except InvalidRequestError:
   db.session.rollback()
except Exception as e:
   print(e)

解决:在所有的数据库操作的时候捕捉异常进行事务的回滚。

以上就是分析解决sqlalchemy数据库连接池QueuePool异常的详细内容,更多关于sqlalchemy数据库连接池QueuePool异常的资料请关注脚本之家其它相关文章!

来源:https://blog.csdn.net/chenxiyuehh/article/details/113339626

标签:sqlalchemy,QueuePool,异常解决
0
投稿

猜你喜欢

  • 常用的三种修改mysql最大连接数的方法

    2010-03-09 15:42:00
  • mysql如何通过当前排序字段获取相邻数据项

    2024-01-13 02:24:25
  • python密码学Vignere密码教程

    2022-12-06 10:21:22
  • python3实现名片管理系统

    2022-01-21 22:11:01
  • Python实现多线程爬表情包详解

    2022-05-26 01:30:55
  • Python集中化管理平台Ansible介绍与YAML简介

    2023-09-23 12:52:34
  • SQLServer 存储过程简介与使用方法

    2009-07-07 14:06:00
  • Go语言的变量定义详情

    2024-04-27 15:41:03
  • 在JavaScript中调用Java类和接口的方法

    2024-04-10 10:42:49
  • Python3 读取Word文件方式

    2021-03-21 22:36:37
  • Python 多线程之threading 模块的使用

    2022-09-01 23:53:27
  • PyCharm 设置数据库,查询数据库语句方式

    2024-01-19 22:05:07
  • Python SDK实现私服上传下载的示例

    2021-11-22 08:14:42
  • asp如何实现按照输入汉字提示拼音功能?

    2010-05-18 18:37:00
  • 从零开始学Python第八周:详解网络编程基础(socket)

    2023-09-04 05:16:20
  • 解读python基于netconf协议获取网元的数据

    2023-06-29 20:26:23
  • © 版权符号显示不清楚解决方法

    2008-02-18 14:46:00
  • PyCharm 常用快捷键和设置方法

    2022-04-09 01:40:59
  • 去除DW MX 2004表格宽度辅助

    2010-09-02 12:37:00
  • 浅谈javascript的分号[译]

    2009-12-13 10:34:00
  • asp之家 网络编程 m.aspxhome.com