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语句太大导 ...
随机推荐
- centos7下启动Django项目报错(sqlite错误)
报错内容如下: [root@localhost project]# python3 manage.py runserver Watching for file changes with StatRel ...
- Android 12(S) MultiMedia Learning(五)NuPlayer
之前几节看到MediaPlayer的java接口最终会调用到native层中的NuPlayer,NuPlayer由Render,DecoderBase,Source三部分组成. Render:负责AV ...
- Go的接口与多态
什么是Go的接口? 接口可以说是一种类型,可以粗略的理解为他的变量是一堆方法. 一个简单的案例: r,_ := http.Get("http://www.baidu.com") i ...
- 霍夫变换原理及实现(Opencv C++)
已知一幅图像中的n个点,假设我们希望找到这些点中位于直线上的子集.一种可能的解决方法是,首先找到由每对点确定的所有直线,然后寻找靠近特定直线的那些点的所有子集.这种方法涉及寻找n(n-1)/2~n2条 ...
- Linux扩展篇-shell编程(五)-流程控制(二)-case语句
基本语法: case expression in pattern1) statement1 ;; pattern2) statement2 ;; *) statement3 ;; esac 注意事项: ...
- springboot项目中一些小技巧
一.使用命令创建maven工程 1.例如我们想在IDEA的工作空间目录下E:\Gitee\springboot,创建maven项目,首先先进入该目录下 2.去掉原来的目录,输入cmd,然后回车,进入命 ...
- 从pfx私钥证书中提取私钥
要准备openssl win 32 del /Q c:\mch_private2.pem c:\OpenSSL-Win32\bin\openssl.exe pkcs12 -in c:\mch_priv ...
- 夜莺官方文档优化第一弹:手把手教你部署和架构讲解,消灭所有部署失败的 case!干!
前置说明 各种环境的选型建议 Docker compose 方式:仅仅用于简单测试,不推荐在生产环境使用 Docker compose,升级起来挺麻烦的,除非你对 Docker compose 真的很 ...
- readonly和disable的区别是什么?
Readonly和Disabled两种属性的写法如下: 1.<input type="text" name="name" value="xxx& ...
- 【IEEE 出版】 第三届能源与电力系统国际学术会议 (ICEEPS 2024)
[连续2届会后4-5个月EI检索,检索稳定!特邀院士.Fellow 报告!]第三届能源与电力系统国际学术会议 (ICEEPS 2024)以"创造更加柔性.智能的能源电力系统"为主题 ...