分析解决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异常的资料请关注其它相关文章!