Django 自定义装饰器解决MySQL server has gone away错误
Django 自定义装饰器解决MySQL server has gone away错误
by:授客 QQ:1033553122
测试环境
Win 10
Python 3.5.4
Django-2.0.13.tar.gz
官方下载地址:
https://www.djangoproject.com/download/2.0.13/tarball/
问题描述
实际项目开发中,编写定时任务,通过Django自带的orm去操作数据库,发现某次执行程序报错:
MySQL server has gone away
原因分析
mysql数据库存在超时关闭非活动状态连接的机制,导致Django获取的连接失效,但是Django自身并不知道。当我们在前端通过api、web页面发送request,Django处理request时会发送Signals,进而触发连接状态检查,自动关闭不可用连接,又因为不存在可用连接的情况下,Django会自动重新创建数据库连接,执行我们想要的操作,所以一般情况不会报这个错误。但是当我们使用定时任务,直接使用orm去操作数据库时并不会触发发送Signals的操作,拿着失效连接去操作数据库,然后就报错了
参考链接:
https://docs.djangoproject.com/en/1.8/ref/signals/#module-django.db.models.signals
解决方法
自定义关闭不可用连接装饰器,在操作数据库之前进行关闭不可用连接操作。
编写装饰器代码
编写实现代码前,我们先看下Django相关源码
Django-2.0.13\django\db\__init__.py
...略
# Register an event to reset saved queries when a Django request is started.
def reset_queries(**kwargs):
for conn in connections.all():
conn.queries_log.clear()
signals.request_started.connect(reset_queries)
# Register an event to reset transaction state and close connections past
# their lifetime.
def close_old_connections(**kwargs):
for conn in connections.all():
conn.close_if_unusable_or_obsolete()
signals.request_started.connect(close_old_connections)
signals.request_finished.connect(close_old_connections)
如上英文注释,可知道,开始请求和完成请求都会调用close_old_connections,重置会话事务状态,关闭超过生命周期的连接,所以我们可以参照这个实现自己的装饰器
新建wrappers.py
本例中,wrappers.py存放路径:TMP/backend/common/wrappers.py(这里TMP是我的项目名称,backend为新建应用名称)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
'''
自定义装饰器
'''
from django.db import close_old_connections
def close_old_database_connections(func):
'''自定义decorator,用来装饰使用数据库操作函数'''
def wrapper(*args, **kwargs):
close_old_connections()
return func(*args, **kwargs)
return wrapper
使用装饰器
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
from backend.common.wrappers import close_old_database_connections
@close_old_database_connections
def gather_zengtao_group_defect_trend_data():
# ...Django orm数据库操作
Django 自定义装饰器解决MySQL server has gone away错误的更多相关文章
- python django 自定义 装饰器
# -*-coding:utf-8-*- __author__ = "GILANG (pleasurelong@foxmail.com)" """ d ...
- Django自定义装饰器
装饰器模板: def decorator(func): def wrapper(*args,**kwargs): return func(*args,**kwargs) return wrapper ...
- Django学习笔记第八篇--实战练习四--为你的视图函数自定义装饰器
零.背景: 对于登录后面所有视图函数,都需要验证登录信息,一般而言就是验证cookie里面的一些信息.所以你可以这么写函数: def personinfo(request): ": retu ...
- CBV加装饰器解决登录注册问题和 <<中间件>>
文本目录 CBV加装饰器解决登录注册问题 一:什么是中间件 二:中间件有什么用 三:自定义中间件 四:中间件应用场景 五:SCRF TOKEN跨站请求伪造 六: 其他操作 CBV加装饰器解决登录注册问 ...
- 解决MySQL server has gone away问题的两种有效办法
最近做网站有一个站要用到WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到M ...
- mysql出现mysql server has gone away错误的解决办法
应用程序(比如PHP)长时间的执行批量的MYSQL语句.执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段.比如,图片数据的处理.都容易引起MySQLserver has ...
- Django - CBV装饰器实现用户登录验证
一.使用Django自带的decorator 通常情况,使用 函数定义的view,可以直接使用 login_required 直接装饰 @login_required def index(reques ...
- python测试开发django-58.MySQL server has gone away错误的解决办法
前言 使用django执行sql相关操作的时候,出现一个"MySQL server has gone away"错误,后来查了下是sql执行过程中,导入的文件较大时候,会出现这个异 ...
- MySQL server has gone away错误的解决办法
在我们使用mysql导入大文件sql时可能会报MySQL server has gone away错误,该问题是max_allowed_packet配置的默认值设置太小,只需要相应调大该项的值之后再次 ...
- Navicat中MySQL server has gone away错误怎么办【转载】
转载链接:http://www.111cn.net/database/mysql/64073.htm mysql数据库出现MySQL server has gone away错误一般是sql语句太大导 ...
随机推荐
- jQuery模态框原理
<!-- 引入jQuery.js --> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquer ...
- json 编码后导致数字变为科学计数,从而导致解码后签名与编码前签名不正确的解决办法。
docoder := json.NewDecoder(strings.NewReader(string(originData))) docoder.UseNumber() _ = docoder.De ...
- SDL入门
本篇主要用于记录SDL2.0.22的基本用法,参考别人的代码,并加了注释方便理解这些api 以下两个demo可以在VS中编译并运行,代码参考 SDL视频显示_奋斗吧!骚年!的博客-CSDN博客 1.S ...
- 来自多彩世界的控制台——C#控制台输出彩色字符画
引言 看到酷安上有这样一个活动,萌生了用 C# 生成字符画的想法,先放出原图. 酷安手绘牛啤 §1 黑白 将图像转换成字符画在 C# 中很简单,思路大致如下: 加载图像,逐像素提取明度. ...
- .Net6 MiNiApi +EFCore6.0高B格操作的WebApi
编辑器的选择项目运行雏形EFCore6.0的使用实体创建是 ASP.NET Core 架构中的核心组件之一,它 ...
- 判断一个数n是不是快乐数
引言 题目:编写一个算法来判断一个数n是不是快乐数 来源:网友分享的面试算法题 题目描述 [快乐数定义] 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和. 然后重复这个过程直到这个数变为 ...
- FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
<FFmpeg开发实战:从零基础到短视频上线>一书的"2.1.1 音视频编码的发展历程"介绍了H.26x系列的视频编码标准,其中H.264至今仍在广泛使用,无论视频 ...