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

目录
  • 数据库相关错误的解决办法
    • 错误一:数据库连接池超过限制
    • 错误二:数据库事务未回滚

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

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

SqlAlchemy QueuePool limit overflow

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

解决办法

  • 方法一

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

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

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

查询报错: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异常的资料请关注我们其它相关文章!

(0)

相关推荐

  • 如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱

    在使用 SQLAlchemy 时,那些看似很小的选择可能对这种对象关系映射工具包的性能产生重要影响. 对象关系映射Object-relational mapping(ORM)使应用程序开发人员的工作更轻松,在很大程度是因为它允许你使用你可能知道的语言(例如 Python)与数据库交互,而不是使用原始 SQL 语句查询. SQLAlchemy是一个 Python ORM 工具包,它提供使用 Python 访问 SQL 数据库的功能.它是一个成熟的 ORM 工具,增加了模型关系.强大的查询构造范式.

  • Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)

    首先说下,由于最新的 0.8 版还是开发版本,因此我使用的是 0.79 版,API 也许会有些不同.因为我是搭配 MySQL InnoDB 使用,所以使用其他数据库的也不能完全照搬本文. 接着就从安装开始介绍吧,以 Debian/Ubuntu 为例(请确保有管理员权限):1.MySQL 复制代码 代码如下: apt-get install mysql-serverapt-get install mysql-clientapt-get install libmysqlclient15-dev 2.

  • Python使用sqlalchemy模块连接数据库操作示例

    本文实例讲述了Python使用sqlalchemy模块连接数据库操作.分享给大家供大家参考,具体如下: 安装: pip install sqlalchemy # 安装数据库驱动: pip install pymysql pip install cx_oracle 举例:(在url后面加入?charset=utf8可以防止乱码) from sqlalchemy import create_engine engine=create_engine('mysql+pymysql://username:p

  • 使用SQLAlchemy操作数据库表过程解析

    需求场景: 使用sqlalchmy从现有的表中获取数据(不是自己建表).百度了一下,网上都是使用sqlalchemy自己先创建表,然后导入数据表的模型类进行增删改查:现在不是自己建表,该如何操作呢? 操作方案 通过sqlalchmey执行原生的sql语句,增删改查的原生语句携带表名,就不需要导入数据表的模型类了. 使用的包: SQLAlchemy (1.3.10) + mysql-connector-python (8.0.19) 提供以下干货: 演示了向原生sql语句传递变量的用法 即动态执行

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

    目录 数据库相关错误的解决办法 错误一:数据库连接池超过限制 错误二:数据库事务未回滚 数据库相关错误的解决办法 错误一:数据库连接池超过限制 SqlAlchemy QueuePool limit overflow 造成连接数超过数据库连接池的限制,有两方面的原因,第一个是由于数据库连接池数比较小,因此当连接数稍微增加的时候就会超过限制,另一个原因就是在使用完数据库连接后未能即使释放,最后造成数据连接数持续增加从而超出数据库连接池的限制,所以我们也可以从这两个方面来解决这个问题,但是根本上还是得

  • 解决Python中导入自己写的类,被划红线,但不影响执行的问题

    1. 错误描述 之前在学习Python的过程中,导入自己写的包文件时,与之相关的方法等都会被划红线,但并不影响代码执行,如图: 看着红线确实有点强迫症,并且在这个过程当时,当使用该文件里的方法时不会自动提示方法名,只能靠手全部输入,这种容易造成手误,对于小白特别容易降低编写效率 2. 原因分析 pycharm中,source root概念非常重要,当你在代码中写相对路径的时候,就是以source root为起点进行查询. 而pycharm中,当前的项目文件夹 是默认的source root,当你

  • SpringBoot2.0 中 HikariCP 数据库连接池原理解析

    作为后台服务开发,在日常工作中我们天天都在跟数据库打交道,一直在进行各种CRUD操作,都会使用到数据库连接池.按照发展历程,业界知名的数据库连接池有以下几种:c3p0.DBCP.Tomcat JDBC Connection Pool.Druid 等,不过最近最火的是 HiKariCP. HiKariCP 号称是业界跑得最快的数据库连接池,自从 SpringBoot 2.0 将其作为默认数据库连接池后,其发展势头锐不可当.那它为什么那么快呢?今天咱们就重点聊聊其中的原因. 一.什么是数据库连接池

  • 解决Python中字符串和数字拼接报错的方法

    前言 众所周知Python不像JS或者PHP这种弱类型语言里在字符串连接时会自动转换类型,如果直接将字符串和数字拼接会直接报错. 如以下的代码: # coding=utf8 str = '你的分数是:' num = 82 text = str+num+'分 | 琼台博客' print text 执行结果 直接报错:TypeError: cannot concatenate 'str' and 'int' objects 解决这个方法只有提前把num转换为字符串类型,可以使用bytes函数把int

  • 完美解决python中ndarray 默认用科学计数法显示的问题

    机器环境: Python 3.6.4 numpy==1.14.0 pandas==0.22.0 解决方法: np.set_printoptions(suppress=True) 默认情况下,ndarray数组采用科学计数法显示: 加入代码后: 以上这篇完美解决python中ndarray 默认用科学计数法显示的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 解决Python中定时任务线程无法自动退出的问题

    python的线程有一个类叫Timer可以,用来创建定时任务,但是它的问题是只能运行一次,如果要重复执行,则只能在任务中再调用一次timer,但这样就存在新的问题了,就是在主进程退出后,不能正常退出子线程. from threading import Timer def scheduletaskwrap(): pritn "in task" Timer(10, scheduletaskwrap).start() Timer(10, scheduletaskwrap).start() 象

  • 解决python中使用PYQT时中文乱码问题

    如题,解决Python中用PyQt时中文乱码问题的解决方法: 在中文字符串前面加上u,如u'你好,世界',其他网上的方法没有多去探究,Python的版本也会影响解决方法,故这里只推荐这种. (有人说用toLocal8bit函数也可以,我试了下,貌似不行)请看例子: #coding=utf-8 from PyQt4 import QtGui, QtCore s = QtCore.QString(u'你好(hello)世界(world)') t = s.toLocal8Bit() u = unico

  • 解决python中导入win32com.client出错的问题

    准备写一个操作Excel脚本却在导入包的时候出现了一个小问题 导入包 from Tkinter import Tk from time import sleep, ctime from tkMessageBox import showwarning from urllib import urlopen import win32com.client as win32 报错提示 Traceback (most recent call last): File "estock.pyw", li

  • 解决Python中pandas读取*.csv文件出现编码问题

    1.问题 在使用Python中pandas读取csv文件时,由于文件编码格式出现以下问题: Traceback (most recent call last): File "pandas\_libs\parsers.pyx", line 1134, in pandas._libs.parsers.TextReader._convert_tokens File "pandas\_libs\parsers.pyx", line 1240, in pandas._libs

  • 解决python中画图时x,y轴名称出现中文乱码的问题

    如下所示: #-*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties #k与客户端处理时间的值之间的关系 x=range(2,51,2) y1=[5.393128497232703, 9.57638681757734, 13.828038570286598, 17.88060602988053, 22.943

随机推荐