给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写的Socks5协议代理服务器
Aug 06 Python
Python 模拟购物车的实例讲解
Sep 11 Python
深入理解Python3 内置函数大全
Nov 23 Python
浅谈Python NLP入门教程
Dec 25 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
python导入模块交叉引用的方法
Jan 19 Python
Django+zTree构建组织架构树的方法
Aug 21 Python
Python如何脚本过滤文件中的注释
May 27 Python
Python接收手机短信的代码整理
Aug 02 Python
Python实现爬取网页中动态加载的数据
Aug 17 Python
Python+Matplotlib+LaTeX玩转数学公式
Feb 24 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随机数生成代码与使用实例分析
2011/04/08 PHP
linux iconv方法的使用
2011/10/01 PHP
php调用google接口生成二维码示例
2014/04/28 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
js停止输出代码
2008/07/20 Javascript
javascript 对象比较实现代码
2009/04/27 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
DIV+CSS+jQ实现省市联动可扩展
2016/06/22 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
python面向对象法实现图书管理系统
2019/04/19 Python
python 修改本地网络配置的方法
2019/08/14 Python
IE兼容css3圆角的实现代码
2011/07/21 HTML / CSS
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
怎样让char类型的东西转换成int类型
2013/12/09 面试题
应届毕业生的个人自我鉴定
2013/10/24 职场文书
《一本男孩子必读的书》教学反思
2014/02/19 职场文书
本科生就业推荐信
2014/05/19 职场文书
服装设计师求职信
2014/06/04 职场文书
2015年企业新年寄语
2014/12/08 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书