给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使用scrapy采集时伪装成HTTP/1.1的方法
Apr 08 Python
Python基于正则表达式实现文件内容替换的方法
Aug 30 Python
用Django写天气预报查询网站
Oct 21 Python
在交互式环境中执行Python程序过程详解
Jul 12 Python
基于django ManyToMany 使用的注意事项详解
Aug 09 Python
Python生成词云的实现代码
Jan 14 Python
Python tkinter 下拉日历控件代码
Mar 04 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
Mar 09 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
Apr 09 Python
python退出循环的方法
Jun 18 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 09 Python
scrapy实践之翻页爬取的实现
Jan 05 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
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
2020/03/18 PHP
PHP7新特性
2021/03/09 PHP
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
分享20款好玩的jQuery游戏
2011/04/17 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
javascript常用对话框小集
2013/09/13 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
jquery获取radio值实例
2014/10/16 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
electron-vue开发环境内存泄漏问题汇总
2019/10/10 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
django 单表操作实例详解
2019/07/30 Python
python3 深浅copy对比详解
2019/08/12 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
strlen的几种不同实现方法
2013/05/31 面试题
电大自我鉴定范文
2013/10/01 职场文书
学校运动会开幕演讲稿
2014/01/04 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
小学捐书活动总结
2014/07/05 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
外国人来华邀请函
2015/01/31 职场文书
家装电话营销开场白
2015/05/29 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
OpenCV-Python实现人脸美白算法的实例
2021/06/11 Python