给Python中的MySQLdb模块添加超时功能的教程


Posted in Python onMay 05, 2015

使用Python操作MySQL数据库的时候常使用MySQLdb这个模块。

今天在开发的过程发现MySQLdb.connect有些参数没法设置。通过这个页面我们可以看到在connect的时候,可以设置的option和client_flags和MySQL c api相比差不少。

一个很重要的参数 MYSQL_OPT_READ_TIMEOUT没法设置,这个参数如果不设置,极致状况MySQL处于hang住,自动切换IP漂移,客户端无法重连到新MySQL。

给MySQLdb加Option很简单,只要修改_mysql.c这个把Python对象映射到MySQL操作的文件,添加参数,再加一段mysql_option即可。

下面是修改后的git diff 文件

?View Code BASH

diff --git a/_mysql.c b/_mysql.c
index d42cc54..61a9b34 100644
--- a/_mysql.c
+++ b/_mysql.c
@@ -489,9 +489,10 @@ _mysql_ConnectionObject_Initialize(
"named_pipe", "init_command",
"read_default_file", "read_default_group",
"client_flag", "ssl",
-                 "local_infile",
+                 "local_infile", "read_timeout",
NULL } ;
int connect_timeout = 0;
+    int read_timeout = 0;
int compress = -1, named_pipe = -1, local_infile = -1;
char *init_command=NULL,
*read_default_file=NULL,
@@ -500,7 +501,7 @@ _mysql_ConnectionObject_Initialize(
self->converter = NULL;
self->open = 0;
check_server_init(-1);
-    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ssssisOiiisssiOi:connect",
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ssssisOiiisssiOii:connect",
kwlist,
&host, &user, &passwd, &db,
&port, &unix_socket, &conv,
@@ -509,7 +510,8 @@ _mysql_ConnectionObject_Initialize(
&init_command, &read_default_file,
&read_default_group,
&client_flag, &ssl,
-                    &local_infile /* DO NOT PATCH FOR RECONNECT, IDIOTS
+                    &local_infile, &read_timeout
+                    /* DO NOT PATCH FOR RECONNECT, IDIOTS
IF YOU DO THIS, I WILL NOT SUPPORT YOUR PACKAGES. */
))
return -1;
@@ -540,6 +542,12 @@ _mysql_ConnectionObject_Initialize(
mysql_options(&(self->connection), MYSQL_OPT_CONNECT_TIMEOUT,
(char *)&timeout);
}
+
+    if (read_timeout) {
+        unsigned int timeout = read_timeout;
+        mysql_options(&(self->connection), MYSQL_OPT_READ_TIMEOUT, (char *)&timeout);
+    }
+
if (compress != -1) {
mysql_options(&(self->connection), MYSQL_OPT_COMPRESS, 0);
client_flag |= CLIENT_COMPRESS;

代码修改完毕,python setup.py install 即可,如果出现mysql_config找不到的问题。你还要修改setup_posix.py文件。

hoterran@hoterran-laptop:~/Projects/MySQL-python-1.2.3$ git diff setup_posix.py
diff --git a/setup_posix.py b/setup_posix.py
index 86432f5..f4f08f1 100644
--- a/setup_posix.py
+++ b/setup_posix.py
@@ -23,7 +23,7 @@ def mysql_config(what):
     if ret/256 > 1:
       raise EnvironmentError("%s not found" % (mysql_config.path,))
   return data
-mysql_config.path = "mysql_config"
+mysql_config.path = "/usr/local/mysql/bin/mysql_config"

 def get_config():
   import os, sys

编译通过,我们来试试添加的read_timeout这个参数。

conn = MySQLdb.connect(host = DB_SERVER,user = DB_USERNAME,passwd = DB_PASSWORD,db = DB_NAME, port=int(DB_PORT), client_flag = 2, read_timeout = 10)

然后执行语句前,你试着把mysql用gdb hang住10s后,python就会异常抛错

OperationalError: (2013, 'Lost connection to MySQL server during query')
 >/home/hoterran/Projects/dbaas/trunk/dbtest.py(18)()
 >mydb.execute_sql(conn, sql)
(Pdb)
--Return--
> /home/hoterran/Projects/dbaas/trunk/dbtest.py(18)()->None
> mydb.execute_sql(conn, sql)
(Pdb)
OperationalError: (2013, 'Lost connection to MySQL server during query')
> <string>(1)<module>()->None

Python 相关文章推荐
深入探究Python中变量的拷贝和作用域问题
May 05 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
Python编程实现正则删除命令功能
Aug 30 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
Python高级特性切片(Slice)操作详解
Sep 27 Python
使用python Telnet远程登录执行程序的方法
Jan 26 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
django基于cors解决跨域请求问题详解
Aug 06 Python
python爬虫实例之获取动漫截图
May 31 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
python入门教程之基本算术运算符
Nov 13 Python
解决python绘图使用subplots出现标题重叠的问题
Apr 30 Python
用Python实现一个简单的多线程TCP服务器的教程
May 05 #Python
简单介绍Python中的try和finally和with方法
May 05 #Python
python中的闭包用法实例详解
May 05 #Python
Python闭包实现计数器的方法
May 05 #Python
深入探究Python中变量的拷贝和作用域问题
May 05 #Python
Python使用metaclass实现Singleton模式的方法
May 05 #Python
python中查看变量内存地址的方法
May 05 #Python
You might like
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
Js 随机数产生6位数字
2010/05/13 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
jquery实现模拟百分比进度条渐变效果代码
2015/10/29 Javascript
基于jQuery实现简单的折叠菜单效果
2015/11/23 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
layui的table中显示图片方法
2018/08/17 Javascript
python ip正则式
2009/05/07 Python
Python CSV模块使用实例
2015/04/09 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
Python中异常重试的解决方案详解
2017/05/05 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
numpy排序与集合运算用法示例
2017/12/15 Python
python中的tcp示例详解
2018/12/09 Python
简单了解django缓存方式及配置
2019/07/19 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
应届大学生简历中的自我评价
2014/01/15 职场文书
心理学专业大学生职业生涯规划范文
2014/02/19 职场文书
酒店总经理职务说明书
2014/02/26 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书