给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中的yield浅析
Jun 16 Python
python开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
Python 基础教程之str和repr的详解
Aug 20 Python
python3个性签名设计实现代码
Jun 19 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
python PrettyTable模块的安装与简单应用
Jan 11 Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
Aug 08 Python
用python写测试数据文件过程解析
Sep 25 Python
wxpython绘制圆角窗体
Nov 18 Python
深入浅析python的第三方库pandas
Feb 13 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程序中的常见漏洞进行攻击(上)
2006/10/09 PHP
加强版phplib的DB类
2008/03/31 PHP
php 记录进行累加并显示总时长为秒的结果
2011/11/04 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
2019/01/23 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
python批量创建指定名称的文件夹
2019/03/21 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
Manuka Doctor美国官网:麦卢卡蜂蜜和蜂毒护肤
2016/12/25 全球购物
美国在线宠物商店:Chewy
2019/01/12 全球购物
个人简历自我评价范文
2014/02/04 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
详解Node.js如何处理ES6模块
2021/05/15 Javascript
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL
详解JavaScript中Arguments对象用途
2021/08/30 Javascript