django 数据库连接模块解析及简单长连接改造

Django集成MongoDB实战:PyMongo连接池与四层封装指南 MongoDB作为主流文档型数据库,其Schema自由、嵌套文档和高吞吐特性常被用于日志、内容管理、用户行为等场景;而Django作为成熟Web框架,虽原生支持关系型数据库,但通过PyMongo可实现高效、可控的非ORM集成。本文围绕‘Django连接MongoDB’这一高频技术需求,解析范式差异本质,详解Windows本地安装避坑要点,实测PyMongo连接池参数对并发性能的影响,并提出可落地的四层封装架构——从连接管理、集合基类到业务逻辑与视图集成,兼顾稳定性、可观测性与可维护性,适用于中大型Djang 阅读详情

django 数据库连接模块解析及简单长连接改造

 

django 数据库连接模块解析及简单长连接改造

工作中纯服务端的项目用到了线程池和django的ORM部分。django 的数据库连接在每一个线程中开启一份,并在查询完毕后自动关闭连接。

线程池处理任务时,正常使用的连接中不会被关闭,但由于数据库端有最长连接时间的限制(默认为8小时),在超时后会发生InterfaceError: (0, '')(连接关闭后使用连接/游标)或Error(2006, 'MySQL server has gone away')(mysql 服务器主动关闭连接)这类错误,所以一般会在每个任务线程中调用django.db.connection.close()进行关闭操作。

但对于频繁进行数据库连接并操作数据库的业务,反复创建连接并不是好的选择,这种场景下可以考虑将连接改造为长连接。

1. django 代码的阅读笔记

django.db.__init__.py 
#对象:
connections = ConnectionHandler()
connection = DefaultConnectionProxy()
# 函数
# 重置查询记录缓存
def reset_queries(**kwargs):
    pass
# 关闭不可用或超时(如果有设置 CONN_MAX_AGE)连接
def close_old_connections(**kwargs):
    pass
# 信号
# 在请求开始或完成时自动调用相应处理函数
signals.request_started.connect(reset_queries)
signals.request_started.connect(close_old_connections)
signals.request_finished.connect(close_old_connections)

重点是connections和connection两个实例
connections 是 ConnectionHandler类
connections.all()会给出一个列表,里面的元素为DatabaseWrapper类
ConnectionHandler内置对象及连接管理:

def __init__():
    self._connections = local()

# 连接包装类里的连接是根据配置情况使用相应的连接
def __getitem__(self, alias):
    '''略'''
    db = self.databases[alias]
    backend = load_backend(db['ENGINE'])
    conn = backend.DatabaseWrapper(db, alias)
    setattr(self._connections, alias, conn)

# 返回所管理的数据库连接
# 管理方式:分数据库,线程管理连接  
def all(self):
    return [self[alias] for alias in self]

# 关闭所有数据库连接
def close_all(self):
    for alias in self:
        try:
            connection = getattr(self._connections, alias)
        except AttributeError:
            continue
        connection.close()
connection.connection = '被包装的pymysql.connections.Connection实例`
connection.close_at = None if max_age is None else time.time() + max_age    # 设置的连接关闭时间

connection.connect()# 获取连接
connection.cursor() # 获取游标
connection.close()# 关闭连接
if not db.connection.connection or db.connection.close_at < time.time():
    db.connection.close()
    db.connection.connect()
    db.connection.close_at = time.time()  +  max_age
    print "A new conn creates !"
else:
    print "Still old conn!"

这样每个线程池中的线程会循环执行任务并只使用同一个连接,并可以控制在自己需要的连接时长后更换连接。
针对线程池的情况,close_old_connections基本没啥用处, 可以跳过该处理
django.db.close_old_connections = lambda **kwargs : None

django-dbconn-retry:修补Django,以在失败的数据库连接上重新连接一次,然后再失败。 例如,通过HAProxy帮助运行Django ORM 立即下载

相关推荐

Django数据库连接丢失问题的解决方法

问题 在Django中使用mysql偶尔会出现数据库连接丢失的情况,错误通常有如下两种 OperationalError: (2006, ‘MySQL server has gone away’) OperationalError: (2013, ‘Lost connection to MySQL server during query’) 查询mysql全局变量SHOW GLOBAL VARIABLES;可以看到wait_timeout,此变量表示连接空闲时间。如果客户端使用一个连接查询多次数据库,如果连续查询则没有问题,如果查询几次后停顿超过wait_timeout后再次查询就会出

Django数据库连接丢失问题

问题 在Django中使用mysql偶尔会出现数据库连接丢失的情况,错误通常有如下两种 1. OperationalError: (2006, 'MySQL server has gone away') 1. OperationalError: (2013, 'Lost connection to MySQL server during query') 查询mysql全局变量SHOW GLOBAL...

weixin_33923762的博客 901

详解多线程Django程序耗尽数据库连接的问题

Django的ORM是非常好用的,哪怕不是做Web项目也值得一用,所以网上也可以找到不少使用 Django 开发非Web项目的资料,因为除了ORM之个,命令行、配置文件等组件也非常好用。 最近用这种方式开发了一个非Web项目,而且是多线程的。有N个工作线程从DB中获取jobs,并把结果写回DB。简单来说就是这样。 项目运行一段时间后,发现数据库连接耗尽了,幸好内存大,然后一直往上调,最后连接数都上九千多一万了。耗尽连接数的时候,PostgreSQL 会出现类似这样的错误: FATAL: remaining connection slots are reserved for non-repli

Django学习之数据库的链接详解

最近总会遇到 MySQL server has gone away 的报错,然后就看了一下django数据库连接这一块。   django数据库连接   ORM中数据库连接用到的 connections ,从 django.db 模块引入,属于 ConnectionHandler 对象。   # django.db.__init__.py   # django ORM中用到

qq_32506555的博客 1118

白话详细解读(七)----- CBAM:Convolutional Block Attention Module

一、CBAM简介 论文链接:https://x.sci-hub.org.cn/scholar?hl=zh-TW&as_sdt=0%2C5&q=CBAM%3A+Convolutional+Block+Attention+Module&btnG=&oq=CB CBAM这篇论文是在2018年提出的,自提出之后,已经被引用上千次,可见其影响力。CBAM是一种专门为了卷积神经网络而设计的注意力模块,传统的卷积存在只关注局部信息,而往往忽略全局信息的弊端,以3*3卷积为例,滤波器有9个

奋斗の博客 1万+

华为无线WiFi实战:基于802.1x与NPS的企业级认证部署指南

本文提供了一份详尽的华为无线WiFi企业级认证部署实战指南。通过整合802.1x协议与Windows NPS服务器,构建基于AD域账号的安全认证体系,彻底解决传统WiFi密码共享带来的安全风险。文章详细拆解了从NPS服务器配置、证书部署到华为AC端RADIUS模板、AAA方案、认证域及VAP模板调用的全流程,并附有终端连接测试与常见故障排查方法,助力企业实现高效、安全的无线网络接入管理。

weixin_29239661的博客 267

django访问数据库,连接丢失的问题

由于连续多次访问数据库,导致旧的连接没消失,连接数满了就访问不到数据库了,解决该问题的方法: from django.db import close_old_connections 每次访问后,加上这句话即可。 ...

weixin_43890188的博客 481

1. Klipper从安装到运行

本文记录Klipper固件从安装,配置到运行的详细过程

weixin_42098934的博客 1万+

django mysql长连接_django 数据库连接模块解析及简单长连接改造方法

工作中纯服务端的项目用到了线程池和django的ORM部分。django 的数据库连接在每一个线程中开启一份,并在查询完毕后自动关闭连接。线程池处理任务时,正常使用的连接中不会被关闭,但由于数据库端有最长连接时间的限制(默认为8小时),在超时后会发生InterfaceError: (0, '')(连接关闭后使用连接/游标)或Error(2006, 'MySQL server has gone aw...

weixin_42602368的博客 481

MATLAB闪退别慌!5分钟搞定Windows系统预设文件修复(附详细截图)

本文针对MATLAB在Windows系统下频繁闪退的问题,提供了快速有效的解决方案。核心在于修复或重置损坏的MATLAB预设文件,通过图文并茂的五步法,指导用户定位AppData目录、重命名预设文件夹,从而让MATLAB自动生成全新配置以解决闪退。文章还涵盖了问题诊断、设置备份及进阶排查方法,帮助用户彻底根除启动故障。

weixin_29234423的博客 925

【知识图谱】Neo4j基本操作及数据库文件导入(graph.db.dump)

初探Neo4j导入数据备份数据客户端操作导入csv文件指定csv文件格式使用命令行导入csv文件附录 请读者参考上篇博文 Neo4j安装教程 导入数据 若开启服务,先在终端停止 Neo4j 服务 ./neo4j stop 接下来,下载射雕三部曲的数据库文件 wget https://labfile.oss.aliyuncs.com/courses/1354/graph.db.dump 下载完将出现 graph.db.dump 文件: 将数据库文件导入到 Neo4j 中 首先进入neo4j 根目录下:

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 8619

django数据库优化(一)

django数据库优化(一) # 版本背景 python:3.7 django:2.2 mysql:8.0 前景:因为django在每次查询时就进行一次数据库连接操作,而且查询完成之后就立马关闭连接,因此在进行频繁操作数据库的场景下该操作十分不友好,会大大增加了数据库的压力,降低服务性能。 解决方案:修改django数据库的短连接,改用长连接 查阅官方文档:Django Databases 持久化连接 持久化连接避免了在每个请求中重新建立到数据库的连接的开销。它们由CONN_MAX_AGE定义连接最长生命

wphoenix的博客 1万+

74、光谱成像在电子内窥镜及色彩理论中的应用

本文探讨了光谱成像在电子内窥镜中的应用及其与色彩理论的深度融合。通过分析FICE技术、色彩再现模型及胃黏膜光谱测量,展示了光谱信息在提升医学诊断准确性方面的潜力。同时,系统阐述了颜色的物理属性、标准表示方法、同色异谱现象、颜色测量技术(密度法与比色法)以及CIELAB等均匀颜色空间的构建原理。结合流程图与对比表格,梳理了从光信号获取到颜色处理的完整路径,并展望了人工智能与新型视觉模型在未来医疗成像与色彩科学中的发展方向。

g2h3i4j5的博客 152

Django数据库连接优化:连接池配置全指南

在高并发Web应用中,数据库连接管理直接影响系统性能与稳定性。传统短连接模式下,每次请求都需建立新连接,导致频繁的TCP握手/挥手和认证过程,造成**30-50%的性能损耗**。Django作为Python生态中最流行的Web框架,其默认连接管理机制在高并发场景下存在明显瓶颈。本文将系统讲解Django数据库连接池的工作原理、配置方法及性能调优策略,帮助开发者构建支持百万级请求的高性能应用。 >...

gitblog_00136的博客 1016

GD32F4xx MCU ADC+DMA 多通道采样

1、GD32F4xx ADC GD32F4xx 的12位ADC是一种采用逐次逼近方式的模拟数字转换器。 1.1 主要特征 可配置12位、10位、8位、6位分辨率; ADC采样率:12位分辨率为2.6MSPs,10位分辨率为3.0 MSPs。分辨率越低,转换越快; PS: MSPs (模拟混合信号转换速率),是指完成1次从模拟转换到数字的AD转换所需的时间的倒数。常用单位是ksps和Msps,表示每秒采样(千)/(百万)次(kilo / Million Samples per Second)。 1msps

madao1234的博客 8117

如何使用 Claude Code 搜索 SAP note

当然,Claude Code 自己仍然要有一种合法可用的模型访问方式,例如 Claude 订阅、Anthropic API 或公司配置的模型提供方式,这和 Browser Extension 是两个问题。因为 Claude Code 已经是完整的 MCP Host,而 Microsoft Playwright MCP 又已经明确支持现有 Chrome Session,两者拼起来在技术架构上完全成立。Microsoft Playwright MCP 默认可以创建持久化浏览器 Profile。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 64

连接断开频繁?,MySQLdb长连接保持与自动重连机制实现方案

解决MySQLdb连接频繁断开问题,优化MySQL操作稳定性。通过长连接保持与自动重连机制,适用于高并发场景,减少异常中断,提升数据库交互效率。配置简单,兼容性强,值得收藏。

BytePerch的博客 948

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

python mysql数据库长连接_python 连接mysql数据库

python34之殇——DJango连接Mysql数据库系统环境:64位 windows 7 + python34 + Django 1.8问题描述:因为MySQLdb不兼容python3.x,导致DJango使用django.db.backends.mysql连接mysql数据库时,出现启动网站报错。解决方法:p...文章:br阶乘2015-04-16734浏览量Python3 知识库Pytho...

weixin_39690625的博客 1014

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

记一次Django响应超慢的解决过程

 在本地windows机器开发的Django项目运行正常,放到服务器上后响应超慢,花了一整个工作日没找到原因(非常绝望),又花了一整个周末才找到原因和临时解决办法,如果你的项目超慢可以参考一下解决思路。 排查过程: 1.怀疑是Python环境问题,到服务器上各种虚拟环境版本进行尝试,无果。 2.因为用了mysql数据库,开始用pymysql包连接改动了一些参数,担心是驱动问题导致数据库查的慢,更换mysqlclient包后,响应依旧慢。 3.担心是有什么报错导致慢,于是艰难地开启了...

Eastyell的专栏 8144

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

转 让Django支持数据库长连接

http://www.cnblogs.com/Alexander-Lee/archive/2011/11/12/django_long_connection.html

走在左边 168

Python web框架总结——Django

1、长连接和短连接 首先介绍下短链接和长连接的区别: 短连接 连接->传输数据->关闭连接 比如HTTP是无状态的的短链接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 因为连接后接收了数据就断开了,所以每次数据接受处理不会有联系。 这也是HTTP协议无状态的原因之一。 长连接 连接->传输数据->保持连接 -> 传输数据-&...

举世无双的博客 1000

Django上Kubernetes的云原生改造:无状态化、安全加固与生产就绪实践

Django作为经典Web框架,其单体部署范式与Kubernetes的云原生架构存在根本性冲突——核心在于‘有状态依赖’与‘声明式、临时化、网络优先’原则的不兼容。要实现真正可扩展与安全的云原生Django服务,必须完成三大转型:一是无状态化改造,将静态文件、媒体存储、数据库连接、Celery Worker等全部解耦为外部托管服务;二是安全机制重构,用Kubernetes Secret替代环境变量、RBAC替代宽泛权限、Ingress TLS替代应用层HTTPS;三是生产就绪设计,通过Liveness/Re

weixin_33919950的博客 358

Django 必会面试题总结

文章转自 https://blog.youkuaiyun.com/weixin_43063753/article/details/85559540 目录 欢迎关注 1 列举Http请求中常见的请求方式 2 谈谈你对HTTP协议的认识。1.1 长连接 3 简述MVC模式和MVT模式 4 简述Django请求生命周期 5 简述什么是FBV和CBV 6 谈一谈你对ORM的理解 7 rest_framework 认...

bruce_van的博客 3848
上一篇: wsgi
下一篇: xlsxwriter学习
qq_15551663
博客等级 码龄12年 4粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值