Django 自定义装饰器解决MySQL server has gone away错误

by:授客 QQ1033553122

测试环境

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错误的更多相关文章

  1. python django 自定义 装饰器

    # -*-coding:utf-8-*- __author__ = "GILANG (pleasurelong@foxmail.com)" """ d ...

  2. Django自定义装饰器

    装饰器模板: def decorator(func): def wrapper(*args,**kwargs): return func(*args,**kwargs) return wrapper ...

  3. Django学习笔记第八篇--实战练习四--为你的视图函数自定义装饰器

    零.背景: 对于登录后面所有视图函数,都需要验证登录信息,一般而言就是验证cookie里面的一些信息.所以你可以这么写函数: def personinfo(request): ": retu ...

  4. CBV加装饰器解决登录注册问题和 <<中间件>>

    文本目录 CBV加装饰器解决登录注册问题 一:什么是中间件 二:中间件有什么用 三:自定义中间件 四:中间件应用场景 五:SCRF TOKEN跨站请求伪造 六: 其他操作 CBV加装饰器解决登录注册问 ...

  5. 解决MySQL server has gone away问题的两种有效办法

    最近做网站有一个站要用到WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到M ...

  6. mysql出现mysql server has gone away错误的解决办法

    应用程序(比如PHP)长时间的执行批量的MYSQL语句.执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段.比如,图片数据的处理.都容易引起MySQLserver has ...

  7. Django - CBV装饰器实现用户登录验证

    一.使用Django自带的decorator 通常情况,使用 函数定义的view,可以直接使用 login_required 直接装饰 @login_required def index(reques ...

  8. python测试开发django-58.MySQL server has gone away错误的解决办法

    前言 使用django执行sql相关操作的时候,出现一个"MySQL server has gone away"错误,后来查了下是sql执行过程中,导入的文件较大时候,会出现这个异 ...

  9. MySQL server has gone away错误的解决办法

    在我们使用mysql导入大文件sql时可能会报MySQL server has gone away错误,该问题是max_allowed_packet配置的默认值设置太小,只需要相应调大该项的值之后再次 ...

  10. Navicat中MySQL server has gone away错误怎么办【转载】

    转载链接:http://www.111cn.net/database/mysql/64073.htm mysql数据库出现MySQL server has gone away错误一般是sql语句太大导 ...

随机推荐

  1. centos7下启动Django项目报错(sqlite错误)

    报错内容如下: [root@localhost project]# python3 manage.py runserver Watching for file changes with StatRel ...

  2. Android 12(S) MultiMedia Learning(五)NuPlayer

    之前几节看到MediaPlayer的java接口最终会调用到native层中的NuPlayer,NuPlayer由Render,DecoderBase,Source三部分组成. Render:负责AV ...

  3. Go的接口与多态

    什么是Go的接口? 接口可以说是一种类型,可以粗略的理解为他的变量是一堆方法. 一个简单的案例: r,_ := http.Get("http://www.baidu.com") i ...

  4. 霍夫变换原理及实现(Opencv C++)

    已知一幅图像中的n个点,假设我们希望找到这些点中位于直线上的子集.一种可能的解决方法是,首先找到由每对点确定的所有直线,然后寻找靠近特定直线的那些点的所有子集.这种方法涉及寻找n(n-1)/2~n2条 ...

  5. Linux扩展篇-shell编程(五)-流程控制(二)-case语句

    基本语法: case expression in pattern1) statement1 ;; pattern2) statement2 ;; *) statement3 ;; esac 注意事项: ...

  6. springboot项目中一些小技巧

    一.使用命令创建maven工程 1.例如我们想在IDEA的工作空间目录下E:\Gitee\springboot,创建maven项目,首先先进入该目录下 2.去掉原来的目录,输入cmd,然后回车,进入命 ...

  7. 从pfx私钥证书中提取私钥

    要准备openssl win 32 del /Q c:\mch_private2.pem c:\OpenSSL-Win32\bin\openssl.exe pkcs12 -in c:\mch_priv ...

  8. 夜莺官方文档优化第一弹:手把手教你部署和架构讲解,消灭所有部署失败的 case!干!

    前置说明 各种环境的选型建议 Docker compose 方式:仅仅用于简单测试,不推荐在生产环境使用 Docker compose,升级起来挺麻烦的,除非你对 Docker compose 真的很 ...

  9. readonly和disable的区别是什么?

    Readonly和Disabled两种属性的写法如下: 1.<input type="text" name="name" value="xxx& ...

  10. 【IEEE 出版】 第三届能源与电力系统国际学术会议 (ICEEPS 2024)

    [连续2届会后4-5个月EI检索,检索稳定!特邀院士.Fellow 报告!]第三届能源与电力系统国际学术会议 (ICEEPS 2024)以"创造更加柔性.智能的能源电力系统"为主题 ...