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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 …