Python特性:裝飾器解決數據庫長時間斷連問題

前言

在基于 Python 的 Web 應用開發里,數據庫連接是極為關鍵的一環。不過,像網絡波動、數據庫服務器維護這類因素,都可能造成數據庫長時間斷連,進而影響應用的正常運作。本文將詳細介紹怎樣運用 retry_on_failure 裝飾器來解決數據庫長時間斷連的難題

一 問題背景

在實際開發場景中,應用和數據庫之間的連接可能會由于各種緣由中斷(長時間系統無人訪問,再次訪問,數據庫連接超時)。當應用嘗試執行數據庫操作時,要是連接已經斷開,就會拋出異常,致使請求失敗。從用戶角度來看,這或許表現為頁面加載失敗或者操作無響應,極大地影響用戶體驗。所以,我們需要一種機制來應對數據庫斷連的狀況,盡可能恢復連接并重新執行操作。

二 程序層面解決方案:retry_on_failure 裝飾器

裝飾器是 Python 中強大的語法糖,它能夠在不修改原有函數代碼的基礎上,為函數增添額外功能。我們可以借助裝飾器實現數據庫操作的重試機制,當數據庫連接斷開時,自動重試一定次數,提升操作成功的幾率。

實現代碼

下面是 retry_on_failure 裝飾器的實現代碼,同時包含了 Web 框架和數據庫連接庫的基本配置:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import timefrom pymysql import OperationalError# 從配置文件導入數據庫連接 URI
from core.config import DATABASE_URI
# 從日志模塊導入日志記錄器
from core.logger import Loggerlogger = Logger("info").loggerapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_POOL_SIZE'] = 5  # 連接池大小
app.config['SQLALCHEMY_MAX_OVERFLOW'] = 10  # 最大溢出連接數
app.config['SQLALCHEMY_POOL_TIMEOUT'] = 30  # 連接池超時時間
app.config['SQLALCHEMY_POOL_RECYCLE'] = 3600  # 連接池回收時間# 初始化數據庫連接實例
db = SQLAlchemy()
db.init_app(app)MAX_RETRIES = 3
RETRY_DELAY = 5def retry_on_failure(func):def wrapper(*args, **kwargs):for attempt in range(MAX_RETRIES):try:return func(*args, **kwargs)except OperationalError as e:if attempt < MAX_RETRIES - 1:logger.error(f"查詢失敗,嘗試第 {attempt + 2} 次重試...")print(f"查詢失敗,嘗試第 {attempt + 2} 次重試...")time.sleep(RETRY_DELAY)continueelse:logger.error("達到最大重試次數,查詢失敗。")print("達到最大重試次數,查詢失敗。")raisereturn Nonereturn wrapper

代碼解釋

1.配置 Web 框架和數據庫連接庫:設置數據庫連接 URI、連接池大小、超時時間等參數,并且初始化數據庫連接實例。
2.定義重試參數:MAX_RETRIES 代表最大重試次數,RETRY_DELAY 表示每次重試之間的間隔時間(秒)。
3. 實現 retry_on_failure 裝飾器

  • wrapper 函數是實際執行的函數,它會嘗試調用被裝飾的函數。
  • 若在執行過程中拋出 OperationalError 異常,意味著數據庫連接可能斷開,此時會進行重試。
  • 每次重試前,會記錄錯誤日志并暫停一段時間,給數據庫恢復連接的機會。
    若達到最大重試次數仍失敗,則拋出異常。

使用示例

以下是如何使用 retry_on_failure 裝飾器的示例:

class User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(100))@retry_on_failure
def get_user_by_id(user_id):return User.query.get(user_id)# 調用被裝飾的函數
user = get_user_by_id(1)
if user:print(f"用戶姓名: {user.name}")
else:print("未找到用戶")

三 總結

通過運用 retry_on_failure 裝飾器,能夠有效處理數據庫長時間斷連的問題,增強應用的健壯性和穩定性。當數據庫連接斷開時,應用會自動重試一定次數,減少因網絡波動或數據庫臨時故障導致的請求失敗。在實際應用中,可以依據具體情況調整最大重試次數和重試間隔時間,以實現最佳效果。

  • 注意事項
    盡管重試機制能提高應用的容錯能力,但如果數據庫長時間無法恢復連接,最終還是會失敗。所以,需要及時排查數據庫故障并進行修復。
    頻繁的重試可能會加重服務器負擔,建議合理設置重試次數和間隔時間。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89937.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89937.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89937.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

療愈之手的智慧覺醒:Deepoc具身智能如何重塑按摩機器人的觸覺神經

療愈之手的智慧覺醒&#xff1a;Deepoc具身智能如何重塑按摩機器人的觸覺神經康復中心的理療室內&#xff0c;一位運動員正俯臥在治療床上。機械臂的硅膠觸頭沿腰背肌群緩緩移動&#xff0c;當傳感器捕捉到豎脊肌的異常僵直時&#xff0c;觸頭自動切換高頻震顫模式&#xff1b;…

webpack將組件vue進行編譯混淆,并能正常使用編譯之后的文件

介紹: 我們在開發的過程中有很多組件都需要復用,特別是我們耗費了好幾天時間寫出來的組件,比如自己寫的表格組件,流程圖組件等。總之都是自己不斷測試,不斷編寫耗費了大把的精力寫的。直接用到自己的項目中倒是無所謂,如果是把自己寫的組件給別人,這里就涉及到自己的勞動…

onenote千年老bug,字體bug (calibri微軟雅黑) 的解決

一、如何改這個bug&#xff08;bug是什么在后文&#xff09;一、注意1、有些onenote可能是版本問題&#xff0c;即使提供了設置默認字體的選項&#xff0c;但按教程設置后還是不work&#xff0c;建議升級版本2、親身測過這個方法是可行的&#xff0c;如果不行&#xff0c;考慮下…

麒麟信安參編的三項軟件供應鏈安全團體標準發布

日前&#xff0c;由中國電子商會正式發布了T/CECC 39—2025《信息安全技術 軟件供應鏈管理規范》、T/CECC 40—2025《信息安全技術 軟件供應鏈開源組件檢測要求》以及 T/CECC 41—2025《信息安全技術 軟件供應鏈軟件產品檢測要素和方法》三項重要團體標準。麒麟信安結合自身在軟…

Django ORM系統

1. ORM基礎概念1.1 什么是ORM&#xff1f;ORM&#xff08;Object Relational Mapping&#xff0c;對象關系映射&#xff09;是一種編程技術&#xff0c;用于在面向對象編程語言中實現不同類型系統的數據轉換。在Django中&#xff0c;ORM充當業務邏輯層和數據庫層之間的橋梁。核…

Tailwind CSS中設定寬度和高度的方法

在 Tailwind CSS 中&#xff0c;設定元素的寬度&#xff08;width&#xff09;和高度&#xff08;height&#xff09;有多種方式&#xff0c;涵蓋固定值、相對值、響應式調整等。以下是完整的方法分類及示例&#xff1a;一、固定寬度 / 高度類以 4px (0.25rem) 為單位遞增&…

Java行為型模式---備忘錄模式

備忘錄模式基礎概念備忘錄模式&#xff08;Memento Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是在不破壞封裝性的前提下&#xff0c;捕獲一個對象的內部狀態&#xff0c;并在該對象之外保存這個狀態&#xff0c;以便后續可以將該對象恢復到先前保存的狀態…

后端參數校驗

前端給后端傳輸數據&#xff0c;有時候參數需要校驗&#xff0c;我們自己寫代碼會比較麻煩&#xff0c;我們可以使用springboot為我們提供的注解&#xff0c;降低這些沒有必要的代碼開發。1.引入依賴<dependency><groupId>org.springframework.boot</groupId>…

C++ - 仿 RabbitMQ 實現消息隊列--服務端核心模塊實現(一)

目錄 日志打印工具 實用 Helper 工具 sqlite 基礎操作類 字符串操作類 UUID 生成器類 文件基礎操作 文件是否存在判斷 文件大小獲取 讀文件 寫文件 文件重命名 文件創建/刪除 父級目錄的獲取 目錄創建/刪除 附錄&#xff08;完整代碼&#xff09; 日志打印工具 為了便…

C語言:第07天筆記

C語言&#xff1a;第07天筆記 內容提要 循環結構 break與continue 綜合案例《猜拳游戲》數組 數組的概念一維數組流程控制 break與continue break 功能&#xff1a; ① 用在switch中&#xff0c;用來跳出switch中的case語句&#xff1b;如果case沒有break&#xff0c;可能會產生…

qt 中英文翻譯 如何配置和使用

qt 中英文翻譯 如何配置和使用 1. 在.pro文件中添加TRANSLATIONS 在你的 .pro 文件&#xff08;比如 HYAC_AAF_HOST.pro&#xff09;中添加&#xff1a; TRANSLATIONS \ zh\_CN.ts en\_US.ts這會告訴Qt項目你要支持中文和英文。 2. 提取可翻譯文本&#xff08;生成ts文件&#…

Leetcode 710. 黑名單中的隨機數

1.題目基本信息 1.1.題目描述 給定一個整數 n 和一個 無重復 黑名單整數數組 blacklist 。設計一種算法&#xff0c;從 [0, n - 1] 范圍內的任意整數中選取一個 未加入 黑名單 blacklist 的整數。任何在上述范圍內且不在黑名單 blacklist 中的整數都應該有 同等的可能性 被返…

RxJava 全解析:從原理到 Android 實戰

在 Android 開發中&#xff0c;異步任務處理是繞不開的核心場景 —— 網絡請求、數據庫操作、文件讀寫等都需要在后臺執行&#xff0c;而結果需回調到主線程更新 UI。傳統的 “HandlerThread” 或 AsyncTask 不僅代碼冗余&#xff0c;還容易陷入 “回調地獄”&#xff08;嵌套回…

OpenCV 官翻7 - 對象檢測

文章目錄ArUco 標記檢測標記與字典標記物創建標記檢測姿態估計選擇字典預定義字典自動生成字典手動定義字典檢測器參數閾值處理adaptiveThreshConstant輪廓過濾minMarkerPerimeterRate 與 maxMarkerPerimeterRatepolygonalApproxAccuracyRateminCornerDistanceRateminMarkerDis…

【Oracle】ORACLE OMF說明

ORACLE OMF (Oracle Managed Files) 是 Oracle 數據庫提供的一項自動化文件管理功能。它的核心目的是簡化數據庫管理員&#xff08;DBA&#xff09;對數據庫底層操作系統文件的管理工作。 以下是 OMF 的關鍵要點&#xff1a; 核心功能&#xff1a;自動命名和定位文件 在創建數據…

408考研逐題詳解:2010年第35題——RIP協議

2010年第35題 某自治系統內采用 RIP 協議&#xff0c;若該自治系統內的路由器 R1 收到其鄰居路由器 R2 的距離矢量&#xff0c;距離矢量中包含信息 <net1, 16>&#xff0c;則能得出的結論是&#xff08; &#xff09; A. R2 可以經過 R1 到達 net1&#xff0c;跳數為17 …

http與https的主要區別是什么?

什么是HTTP&#xff1f; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;是互聯網上應用最為廣泛的一種網絡協議。它構成了Web數據通信的基礎&#xff0c;并定義了客戶端和服務器之間如何請求和傳遞網頁信息。當您在瀏覽器中輸入一個網址時…

STC89C52系列單片機簡介

STC89C52系列單片機是由中國宏晶科技&#xff08;STC&#xff09;推出的一款新一代增強型8051內核單片機。它不僅繼承了傳統8051指令系統的兼容性&#xff0c;還在性能、功耗、抗干擾能力以及性價比方面進行了全面提升&#xff0c;廣泛應用于各類嵌入式控制場景&#xff0c;如工…

基于 Docker 環境的 JupyterHub 詳細部署手冊

本文詳細介紹基于Docker Compose的單機版JupyterHub部署方案&#xff0c;通過容器化技術實現多用戶Notebook環境的快速搭建。方案采用官方JupyterHub鏡像&#xff0c;配置11個端口映射&#xff08;18000-18010&#xff09;支持用戶并發&#xff0c;通過數據卷掛載&#xff08;.…

常見的萬能密碼

目錄 1. 通用SQL注入 2. 登錄繞過 3. 密碼重置 1. 通用SQL注入 or 11-- " or 11-- or aa " or "a""a or 11# " or 11# or 11/* " or 11/* or 11 " or "1""1 2. 登錄繞過 admin-- admin or 11-- admin or aa …