人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

分析解決Python中sqlalchemy數(shù)據(jù)庫連接池QueuePool異常

發(fā)布日期:2022-01-02 00:24 | 文章來源:源碼之家

數(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)文章!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對(duì)1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部