分析解決Python中sqlalchemy數據庫連接池QueuePool異常
數據庫相關錯誤的解決辦法
錯誤一:數據庫連接池超過限制
SqlAlchemy QueuePool limit overflow

造成連接數超過數據庫連接池的限制,有兩方面的原因,第一個是由于數據庫連接池數比較小,因此當連接數稍微增加的時候就會超過限制,另一個原因就是在使用完數據庫連接后未能即使釋放,最后造成數據連接數持續(xù)增加從而超出數據庫連接池的限制,所以我們也可以從這兩個方面來解決這個問題,但是根本上還是得解決后一個原因造成的問題,不然即便是將數據庫連接池增大時間長之后也還是會出現相同的問題。
解決辦法
- 方法一
python和java都有finally關鍵字,在執(zhí)行完所有代碼之后再執(zhí)行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
原因是:連接斷開后,事務沒有回滾,殘留的鎖導致后續(xù)的查詢報錯.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異常的資料請關注腳本之家其它相關文章!
相關文章
Python判斷對象是否為文件對象(file object)的三種方法示例
這篇文章主要介紹了Python判斷對象是否為文件對象(file object)的三種方法示例,https://www.pythontab.com/html/2018/pythonhexinbiancheng_1015/1362.html2019-04-04
向量化操作改進數據分析工作流的Pandas?Numpy示例分析
這篇文章主要介紹了向量化操作改進數據分析工作流的Pandas?Numpy示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10

