给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采用requests库模拟登录和抓取数据的简单示例
Jul 05 Python
python判断给定的字符串是否是有效日期的方法
May 13 Python
Django添加favicon.ico图标的示例代码
Aug 07 Python
Python多图片合并PDF的方法
Jan 03 Python
nohup后台启动Python脚本,log不刷新的解决方法
Jan 14 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
python腾讯语音合成实现过程解析
Aug 01 Python
python的time模块和datetime模块实例解析
Nov 29 Python
使用 Supervisor 监控 Python3 进程方式
Dec 05 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
详解anaconda安装步骤
Nov 23 Python
如何利用opencv判断两张图片是否相同详解
Jul 07 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
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
Javascript 写的简单进度条控件
2008/01/22 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
JavaScript构造函数详解
2015/12/27 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
2016/04/14 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
js实现3D旋转效果
2020/08/18 Javascript
举例讲解Linux系统下Python调用系统Shell的方法
2015/11/07 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
利用python爬取散文网的文章实例教程
2017/06/18 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
Python函数的迭代器与生成器的示例代码
2020/06/18 Python
python更新数据库中某个字段的数据(方法详解)
2020/11/18 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
CSS3 三维变形实现立体方块特效源码
2016/12/15 HTML / CSS
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
校领导推荐信
2013/11/01 职场文书
毕业生文员求职信
2013/11/03 职场文书
酒店拾金不昧表扬信
2014/01/18 职场文书
学生会主席演讲稿
2014/04/25 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
大学同学聚会感言
2015/07/30 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书