当前位置: 首页 > news >正文

【Dv3admin】ORM数据库无法查询的问题

Django 运行过程中,数据库连接的健康状态直接影响应用的稳定性和数据访问准确性。长时间空闲的数据库连接经常因外部机制被回收,进而引发数据查询异常和返回无效结果。

本文围绕 Django 中数据库连接长时间空闲导致的连接失效问题,介绍相关的背景成因,并给出配置与中间件层面的解决办法,包括如何自动检测与维护数据库连接的可用性,保障项目高可用和稳定运行。

文章目录

  • 应用场景
  • 实现方式
  • 总结

应用场景

Django 在运行过程中会维护自己的数据库连接池。如果连接被长时间占用或者在网络上处于空闲状态,有些数据库中间件、负载均衡器、云数据库自身的连接管理机制(比如超时、空闲回收)会自动断开这些连接。Django 并不会主动发现已有的连接已经失效,依然会用“假装还活着”的连接去请求数据。这时候,实际查询没有真正访问到数据库,ORM 返回 None,而不是抛出数据库连接异常。这种情况下,数据库层的数据并没有问题,只是 Django 进程用的连接已经失效,直到服务重启,连接池被清空并重新建立连接,才又能正常查到数据。

PaymentOrderFinance.objects.filter(id=123).first()

这种现象背后的根本原因,通常与数据库连接的“长时间空闲失效”有关。

  • 云数据库有连接超时或空闲连接回收策略,断掉了长时间未活跃的连接。
  • 网络不稳定,导致连接短暂丢失又自动恢复,但 ORM 没有感知到。
  • 负载均衡层或者中间件(比如 ProxySQL、云数据库代理层)清理了“空闲连接”。

实现方式

可以在 Django 的数据库配置中添加 CONN_MAX_AGE(连接最大存活时间),比如设置为 60 秒或者更短,让 Django 自动定期重建连接,减少连接失效的概率。还可以用数据库健康检查机制,或者用中间件对查询失败做重试处理。
例如:

DATABASES = {'default': {# ...'CONN_MAX_AGE': 60,  # 单位为秒}
}

这样 Django 会自动在每次查询时判断连接是否存活,超过设置时间会重连数据库,从而避免这种“假死连接”导致的 None 返回。

并项目下新建中间件 db_keepalive.py 定义一个 Django 中间件类 EnsureDbConnectionMiddleware,用于每次 HTTP 请求到来时自动检测并维护数据库连接的可用性。具体来说,中间件在请求处理流程的最前面调用 connection.close_if_unusable_or_obsolete(),确保如果当前数据库连接已经失效或变得不可用,就会自动关闭这个连接,避免后续操作因连接异常导致报错。这样可以减少数据库连接因长时间空闲或网络问题导致的不可用情况,保证后续每一次数据库访问时连接状态都是健康的。这个中间件适用于需要高可用、稳定数据库连接的场景,比如长时间运行的 Web 服务,能够有效预防由于数据库连接断开引起的异常。

# coding:utf-8
'''
@IDE     :PyCharm 
@Project :ManageBak-HS.py 
@File    :db_keepalive.py
@Author  :Mr数据杨
@Date    :2025/7/25
@Desc    : 
'''from django.db import connectionclass EnsureDbConnectionMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):# 每次请求自动检测数据库连接connection.close_if_unusable_or_obsolete()response = self.get_response(request)return response

在 Django 项目的 settings.py 文件的 MIDDLEWARE 配置中,将这个中间件类添加到合适的位置后,即可实现对所有请求的数据库连接健康管理,提升系统的健壮性和稳定性。

MIDDLEWARE = ["dvadmin.utils.middleware.ApiLoggingMiddleware", # 必须第一个.......
]

总结

数据库连接因空闲被回收引发的失效现象,常见于云数据库、负载均衡或网络环境下,容易导致数据查询异常。通过合理设置 CONN_MAX_AGE 参数和添加数据库连接健康检测中间件,可以有效降低“假死连接”产生的概率,提升查询准确性和系统稳定性。

针对生产环境,建议结合实际场景持续优化数据库连接管理策略,关注不同数据库平台的连接处理细节。未来,结合自动化健康监测与智能重连机制,有望进一步提升 Django 应用的高可用能力,减少因底层连接断开带来的潜在风险。

http://www.dtcms.com/a/306471.html

相关文章:

  • 如何修改VM虚拟机中的ip
  • opengauss数据库安装及测试
  • 【C语言】深度剖析指针(二):指针与数组,字符,函数的深度关联
  • SpringBoot中ResponseEntity的使用详解
  • .NET报表控件ActiveReports发布v19.0——正式兼容 .NET 9
  • 动态爱心视觉特效合集(含 WebGL 与粒子动画)
  • 传输层协议UDP与TCP
  • 微算法科技MLGO突破性的监督量子分类器:纠缠辅助训练算法为量子机器学习开辟新天地
  • G9打卡——ACGAN
  • ​​咖啡艺术的数字觉醒:Deepoc具身智能如何重塑咖啡机器人的“风味直觉”
  • Android基础(二)了解Android项目
  • Android补全计划 TextView设置文字不同字体和颜色
  • SAP-ABAP:SAP ABAP OpenSQL JOIN 操作权威指南高效关联多表数据
  • android-PMS-开机流程
  • 配置国内镜像源加速Python包安装
  • 第2章 cmd命令基础:常用基础命令(3)
  • xxljob-快速上手
  • 真 万人互动MMO游戏技术公開測試
  • 推扫式和凝视型高光谱相机分别采用哪些分光方式?
  • AutoSAR(MCAL) --- ADC
  • Helm在Kubernetes中的应用部署指南与案例解析
  • Newman+Jenkins实施接口自动化测试
  • docker 安装elasticsearch
  • python 中 `batch.iloc[i]` 是什么:integer location
  • ACL 2025 第二弹:维也纳风情舞会点燃学术之夜
  • ActiveMQ消息队列:从入门到Spring Boot实战
  • AI Compass前沿速览:可灵创意工坊、字节Coze StudioCoze Loop、通义万相2.2 、智谱GLM-4.5、腾讯混元3D世界模型开源
  • 16-C语言:第17天笔记
  • sqLite 数据库 (3):以编程方式使用 sqLite,4 个函数,以及 sqLite 移植,合并编译
  • Keil随笔—Lib库的源码级调试