分析解決Python中sqlalchemy數(shù)據(jù)庫連接池QueuePool異常
數(shù)據(jù)庫相關(guān)錯(cuò)誤的解決辦法
錯(cuò)誤一:數(shù)據(jù)庫連接池超過限制
SqlAlchemy QueuePool limit overflow
造成連接數(shù)超過數(shù)據(jù)庫連接池的限制,有兩方面的原因,第一個(gè)是由于數(shù)據(jù)庫連接池?cái)?shù)比較小,因此當(dāng)連接數(shù)稍微增加的時(shí)候就會(huì)超過限制,另一個(gè)原因就是在使用完數(shù)據(jù)庫連接后未能即使釋放,最后造成數(shù)據(jù)連接數(shù)持續(xù)增加從而超出數(shù)據(jù)庫連接池的限制,所以我們也可以從這兩個(gè)方面來解決這個(gè)問題,但是根本上還是得解決后一個(gè)原因造成的問題,不然即便是將數(shù)據(jù)庫連接池增大時(shí)間長之后也還是會(huì)出現(xiàn)相同的問題。
解決辦法
- 方法一
python和java都有finally關(guān)鍵字,在執(zhí)行完所有代碼之后再執(zhí)行finally處的代碼,有這個(gè)關(guān)鍵字相助就讓我們能夠很好的解決這個(gè)問題,只要在進(jìn)行完所有的數(shù)據(jù)庫操作之后將數(shù)據(jù)庫連接關(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é)過python的小可愛們都知道python有個(gè)很好用的東西叫做裝飾器,因?yàn)榉绞降慕鉀Q辦法在針對(duì)一個(gè)函數(shù)操作數(shù)據(jù)庫的時(shí)候還是比較好用的,但是在一個(gè)項(xiàng)目中絕對(duì)是不止一個(gè)操作數(shù)據(jù)的函數(shù)的,如果在每個(gè)操作數(shù)據(jù)庫函數(shù)的后方都加上finally關(guān)鍵值的話,會(huì)顯得很累贅不說,如果有些函數(shù)忘記加了也會(huì)很麻煩,這個(gè)時(shí)候裝飾器就顯得很有用了,只要在函數(shù)上加上一個(gè)關(guān)閉數(shù)據(jù)庫連接的裝飾器,就能夠在所有數(shù)據(jù)庫操作結(jié)束之后關(guān)閉數(shù)據(jù)庫連接
如果有不了解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ù)庫操作函數(shù)前加上上面的裝飾器即可解決對(duì)應(yīng)的問題
錯(cuò)誤二:數(shù)據(jù)庫事務(wù)未回滾
查詢報(bào)錯(cuò):sqlalchemy.exc.InvalidRequestError: Can't reconnect until invalid transaction is rolled back
原因是:連接斷開后,事務(wù)沒有回滾,殘留的鎖導(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ù)庫操作的時(shí)候捕捉異常進(jìn)行事務(wù)的回滾。
以上就是分析解決sqlalchemy數(shù)據(jù)庫連接池QueuePool異常的詳細(xì)內(nèi)容,更多關(guān)于sqlalchemy數(shù)據(jù)庫連接池QueuePool異常的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 3個(gè)Python?SQLAlchemy數(shù)據(jù)庫操作功能詳解
- Python使用SQLAlchemy模塊實(shí)現(xiàn)操作數(shù)據(jù)庫
- Python?SQLAlchemy與數(shù)據(jù)庫交互操作完整指南
- Python使用sqlalchemy實(shí)現(xiàn)連接數(shù)據(jù)庫的幫助類
- Python中使用sqlalchemy操作數(shù)據(jù)庫的問題總結(jié)
- Python中SQLAlchemy庫的使用方法分析
- Python使用SQLAlchemy進(jìn)行復(fù)雜查詢的操作代碼
- Python如何使用sqlalchemy實(shí)現(xiàn)動(dòng)態(tài)sql
- python SQLAlchemy 數(shù)據(jù)庫連接池的實(shí)現(xiàn)
相關(guān)文章
一篇文章帶你了解python標(biāo)準(zhǔn)庫--math模塊
這篇文章主要介紹了Python的math模塊中的常用數(shù)學(xué)函數(shù)整理,同時(shí)對(duì)運(yùn)算符的運(yùn)算優(yōu)先級(jí)作了一個(gè)羅列,需要的朋友可以參考下,希望能給你帶來幫助2021-08-08Pycharm虛擬環(huán)境創(chuàng)建并使用命令行指定庫的版本進(jìn)行安裝
Pycharm創(chuàng)建的項(xiàng)目,使用了虛擬環(huán)境,對(duì)庫的版本進(jìn)行管理,有些項(xiàng)目的對(duì)第三方庫的版本要求不同,可使用虛擬環(huán)境進(jìn)行管理,直接想通過pip命令安裝可以參考下本文的操作步驟2022-07-07PPOCRLabel標(biāo)注的txt格式如何轉(zhuǎn)換成labelme能修改的json格式
這篇文章主要介紹了PPOCRLabel標(biāo)注的txt格式如何轉(zhuǎn)換成labelme能修改的json格式問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03pandas進(jìn)階教程之Dataframe的apply方法
DataFrame中的apply方法就是將函數(shù)應(yīng)用到由列或行形成的一維數(shù)組上,下面這篇文章主要給大家介紹了關(guān)于pandas進(jìn)階教程之Dataframe的apply方法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09詳解TensorFlow訓(xùn)練網(wǎng)絡(luò)兩種方式
本文主要介紹了TensorFlow訓(xùn)練網(wǎng)絡(luò)兩種方式,一種是基于tensor(array),另外一種是迭代器,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12python常用的各種排序算法原理與實(shí)現(xiàn)方法小結(jié)
這篇文章主要介紹了python常用的各種排序算法原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式總結(jié)分析了冒泡排序、插入排序、選擇排序、快速排序等排序算法的相關(guān)原理與實(shí)現(xiàn)方法,需要的朋友可以參考下2023-04-04python、PyTorch圖像讀取與numpy轉(zhuǎn)換實(shí)例
今天小編就為大家分享一篇python、PyTorch圖像讀取與numpy轉(zhuǎn)換實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01使用python實(shí)現(xiàn)對(duì)元素的長截圖功能
這篇文章主要介紹了用python實(shí)現(xiàn)對(duì)元素的長截圖功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-11-11