[django1.6]跑批任务错误(2006, 'MySQL server has gone away')
有个django的定时任务的需求,调用django的orm来对数据库进行数据处理。
在交互环境下直接启动pyhton脚本没有问题,放在定时任务中时候,总是出现
(2006, 'MySQL server has gone away') 的错误,开始以为是定时框架外部调用的问题,但是后来想想也不合理,为啥直接在shell中调用就没错呢,
想到django1.6的一些数据库连接的新属性(例如持久化连接等)会不会有影响,于是google了下。
看到django官网上有人提过这个类似于bug的东西: 有兴趣可以浏览一遍
https://code.djangoproject.com/ticket/21597
如果单纯的查询这个数据库错误,很多都是让你修改mysql的配置,看下这里最终给的建议把。
If you hit this problem and don't want to understand what's going on, don't reopen this ticket, just do this:
RECOMMENDED SOLUTION: close the connection with from django.db import connection; connection.close() when you know that your program is going to be idle for a long time.
CRAPPY SOLUTION: increase wait_timeout so it's longer than the maximum idle time of your program.
In this context, idle time is the time between two successive database queries.
这个方案就说把django到mysql的数据库连接关闭了,然后重新建立一个来查询,如果想了解下为什么,可以重头看下这讨论。
from django.db import connection
def is_connection_usable():
try:
connection.connection.ping()
except:
return False
else:
return True
def do_work():
while(True): # Endless loop that keeps the worker going (simplified)
if not is_connection_usable():
connection.close()
try:
do_a_bit_of_work()
except:
logger.exception("Something bad happened, trying again")
sleep(1)
简单的理解,就是django1.6 会自动保持连接, 因为我这个任务时24小时执行一次, 第一执行的时候django和mysql建立的一个链接A, 结果这个任务10分钟就完成了,连接A开始睡眠,django继续保持这连接。
23小时50分钟以后,这个任务又开始执行了,但是由于msyql的waittime默认是8个小时,连接A这个时候已经死了(msyql单方面解除合同,django还蒙在鼓里),django还用连接A去连接mysql,肯定得到一个gone away的结果。
所有我们在每次执行任务之前去检查连接是否存活,如果没了那么就close,django自动重新建立一个,这样就消除了上面的错误。
本文出自 “orangleliu笔记本” 博客,转载请务必保留此出处http://blog.csdn.net/orangleliu/article/details/41480417
相关文章
- 的功能比较比较SQL Server与MySQL的功能优劣(sqlserver与mysql)
- MySQL字段类型选择:踩坑必备攻略(mysql字段类型选择)
- MySQL系统错误:5号已发生!(mysql发生系统错误5)
- 搭建自己的局域网MySQL数据库(连接局域网mysql)
- MySQL使用带参数游标操作指南(mysql带参数游标)
- MySQL连接错误:排查与解决(mysql连接错误)
- MySQL中删除存储过程的简单方法(mysql删除存储过程)
- MySQL更新密码,保证账户安全(mysql更新密码)
- MySQL如何进行相等判断?(mysql判断相等)
- MySQL 错误日志:查找位置(mysql错误日志在哪)
- php连接Mysql出错:排查与解决(php连接mysql错误)
- MySQL报错:找不到表,请检查表名拼写是否正确(mysql找不到表)
- MySQL错误1054:解决方法与原因分析(mysql错误1054)
- SQL Server和MySQL:功能对比(sqlserver和mysql区别)
- MySQL:实现数据库数据存储的利器(mysql是做什么的)
- Mysql新手指南:如何新建用户(mysql新建用户)
- MySQL中1052错误怎么处理(mysql中1052)
- 解决MySQL中1045错误问题的方法(mysql中1045错误)
- 使用MYSQL实现对两个表的数据修改(mysql两表修改数据)
- ABP框架下MySQL错误的处理方法(abp mysql 出错)
- MySQL处理XML小于符号的方法(mysql xml小于)
- MySQL 查询错误无法查询表(mysql 不能查询表)
- 避免MySQL等于2带来的错误,从不等于2限制开始(mysql 不等于2)