给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 相关文章推荐
Pycharm编辑器技巧之自动导入模块详解
Jul 18 Python
python基础while循环及if判断的实例讲解
Aug 25 Python
Python 结巴分词实现关键词抽取分析
Oct 21 Python
LRUCache的实现原理及利用python实现的方法
Nov 21 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
Python发送手机动态验证码代码实例
Feb 28 Python
python对XML文件的操作实现代码
Mar 27 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
Apr 27 Python
Django正则URL匹配实现流程解析
Nov 13 Python
Python爬虫破解登陆哔哩哔哩的方法
Nov 17 Python
如何向scrapy中的spider传递参数的几种方法
Nov 18 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
短波收音机简介
2021/03/01 无线电
如何使用动态共享对象的模式来安装PHP
2006/10/09 PHP
php中计算未知长度的字符串哪个字符出现的次数最多的代码
2012/08/14 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
PHP递归创建多级目录
2015/11/05 PHP
php实现微信公众号主动推送消息
2015/12/31 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
2016/11/30 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
Ext JS动态加载JavaScript创建窗体的方法
2016/06/23 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
python pdb调试方法分享
2014/01/21 Python
利用python程序帮大家清理windows垃圾
2017/01/15 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
分分钟入门python语言
2018/03/20 Python
Python实现图片拼接的代码
2018/07/02 Python
Python理解递归的方法总结
2019/01/28 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
见习期自我鉴定范文
2014/03/19 职场文书
会计电算化实训报告
2014/11/04 职场文书
优秀班主任材料
2014/12/16 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python