分析解決Python中sqlalchemy數(shù)據(jù)庫(kù)連接池QueuePool異常
數(shù)據(jù)庫(kù)相關(guān)錯(cuò)誤的解決辦法
錯(cuò)誤一:數(shù)據(jù)庫(kù)連接池超過(guò)限制
SqlAlchemy QueuePool limit overflow

造成連接數(shù)超過(guò)數(shù)據(jù)庫(kù)連接池的限制,有兩方面的原因,第一個(gè)是由于數(shù)據(jù)庫(kù)連接池?cái)?shù)比較小,因此當(dāng)連接數(shù)稍微增加的時(shí)候就會(huì)超過(guò)限制,另一個(gè)原因就是在使用完數(shù)據(jù)庫(kù)連接后未能即使釋放,最后造成數(shù)據(jù)連接數(shù)持續(xù)增加從而超出數(shù)據(jù)庫(kù)連接池的限制,所以我們也可以從這兩個(gè)方面來(lái)解決這個(gè)問(wèn)題,但是根本上還是得解決后一個(gè)原因造成的問(wèn)題,不然即便是將數(shù)據(jù)庫(kù)連接池增大時(shí)間長(zhǎng)之后也還是會(huì)出現(xiàn)相同的問(wèn)題。
解決辦法
- 方法一
python和java都有finally關(guān)鍵字,在執(zhí)行完所有代碼之后再執(zhí)行finally處的代碼,有這個(gè)關(guān)鍵字相助就讓我們能夠很好的解決這個(gè)問(wèn)題,只要在進(jìn)行完所有的數(shù)據(jù)庫(kù)操作之后將數(shù)據(jù)庫(kù)連接關(guān)閉即可。
connection = DBSession.connection()
try:
rescount = connection.execute("select resource_id,count(resource_id) as total FROM resourcestats")
#do something
finally:
connection.close()
- 方法二
學(xué)過(guò)python的小可愛(ài)們都知道python有個(gè)很好用的東西叫做裝飾器,因?yàn)榉绞降慕鉀Q辦法在針對(duì)一個(gè)函數(shù)操作數(shù)據(jù)庫(kù)的時(shí)候還是比較好用的,但是在一個(gè)項(xiàng)目中絕對(duì)是不止一個(gè)操作數(shù)據(jù)的函數(shù)的,如果在每個(gè)操作數(shù)據(jù)庫(kù)函數(shù)的后方都加上finally關(guān)鍵值的話,會(huì)顯得很累贅不說(shuō),如果有些函數(shù)忘記加了也會(huì)很麻煩,這個(gè)時(shí)候裝飾器就顯得很有用了,只要在函數(shù)上加上一個(gè)關(guān)閉數(shù)據(jù)庫(kù)連接的裝飾器,就能夠在所有數(shù)據(jù)庫(kù)操作結(jié)束之后關(guān)閉數(shù)據(jù)庫(kù)連接
如果有不了解python的裝飾器的可以看一下這個(gè)文章:理解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
在數(shù)據(jù)庫(kù)操作函數(shù)前加上上面的裝飾器即可解決對(duì)應(yīng)的問(wèn)題
錯(cuò)誤二:數(shù)據(jù)庫(kù)事務(wù)未回滾

查詢報(bào)錯(cuò):sqlalchemy.exc.InvalidRequestError: Can't reconnect until invalid transaction is rolled back
原因是:連接斷開(kāi)后,事務(wù)沒(méi)有回滾,殘留的鎖導(dǎo)致后續(xù)的查詢報(bào)錯(cuò).sqlalchemy對(duì)每一個(gè)查詢和插入等操作都是一個(gè)事務(wù)。
# 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)
解決:在所有的數(shù)據(jù)庫(kù)操作的時(shí)候捕捉異常進(jìn)行事務(wù)的回滾。
以上就是分析解決sqlalchemy數(shù)據(jù)庫(kù)連接池QueuePool異常的詳細(xì)內(nèi)容,更多關(guān)于sqlalchemy數(shù)據(jù)庫(kù)連接池QueuePool異常的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 3個(gè)Python?SQLAlchemy數(shù)據(jù)庫(kù)操作功能詳解
- Python使用SQLAlchemy模塊實(shí)現(xiàn)操作數(shù)據(jù)庫(kù)
- Python?SQLAlchemy與數(shù)據(jù)庫(kù)交互操作完整指南
- Python使用sqlalchemy實(shí)現(xiàn)連接數(shù)據(jù)庫(kù)的幫助類
- Python中使用sqlalchemy操作數(shù)據(jù)庫(kù)的問(wèn)題總結(jié)
- Python中SQLAlchemy庫(kù)的使用方法分析
- Python使用SQLAlchemy進(jìn)行復(fù)雜查詢的操作代碼
- Python如何使用sqlalchemy實(shí)現(xiàn)動(dòng)態(tài)sql
- python SQLAlchemy 數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)
相關(guān)文章
基于Python實(shí)現(xiàn)Word文檔與SVG格式的相互轉(zhuǎn)換
Word和SVG是兩種常見(jiàn)的文件格式,各自有不同的應(yīng)用場(chǎng)景,在實(shí)際應(yīng)用中,我們可能需要將Word文檔內(nèi)容轉(zhuǎn)換為SVG圖形用于網(wǎng)頁(yè)展示,或者將 SVG圖形嵌入到Word文檔中進(jìn)行編輯和排版,這篇博客將探討如何使用Python實(shí)現(xiàn)Word與SVG 格式的相互轉(zhuǎn)換,需要的朋友可以參考下2025-02-02
python光學(xué)仿真PyQt5基礎(chǔ)框架教程
這篇文章主要為大家介紹了python光學(xué)仿真之PyQt5基礎(chǔ)框架教程,文中含有詳細(xì)實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
Python判斷對(duì)象是否為文件對(duì)象(file object)的三種方法示例
這篇文章主要介紹了Python判斷對(duì)象是否為文件對(duì)象(file object)的三種方法示例,https://www.pythontab.com/html/2018/pythonhexinbiancheng_1015/1362.html2019-04-04
PyTorch之怎樣選擇合適的優(yōu)化器和損失函數(shù)
這篇文章主要介紹了PyTorch怎樣選擇合適的優(yōu)化器和損失函數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
如何實(shí)現(xiàn)一個(gè)python函數(shù)裝飾器(Decorator)
這篇文章主要介紹了如何實(shí)現(xiàn)一個(gè)python函數(shù)裝飾器(Decorator),幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-10-10
Python如何爬取51cto數(shù)據(jù)并存入MySQL
這篇文章主要介紹了Python如何爬取51cto數(shù)據(jù)并存入MySQL,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
向量化操作改進(jìn)數(shù)據(jù)分析工作流的Pandas?Numpy示例分析
這篇文章主要介紹了向量化操作改進(jìn)數(shù)據(jù)分析工作流的Pandas?Numpy示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Python+Tkinter簡(jiǎn)單實(shí)現(xiàn)注冊(cè)登錄功能
這篇文章主要為大家詳細(xì)介紹了Python+Tkinter簡(jiǎn)單實(shí)現(xiàn)注冊(cè)登錄功能,連接本地MySQL數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

