给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获取一组数据里最大值max函数用法实例
May 26 Python
node.js获取参数的常用方法(总结)
May 29 Python
使用python实现接口的方法
Jul 07 Python
Python中sort和sorted函数代码解析
Jan 25 Python
python的concat等多种用法详解
Nov 28 Python
Selenium chrome配置代理Python版的方法
Nov 29 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
Oct 21 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
Nov 15 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
Dec 18 Python
python实现经纬度采样的示例代码
Dec 10 Python
Python数据可视化之基于pyecharts实现的地理图表的绘制
Jun 10 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面向对象之后期静态绑定功能介绍
2015/05/18 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
jquery实现简单实用的打分程序实例
2015/07/23 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
python3实现名片管理系统
2020/11/29 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
Python删除n行后的其他行方法
2019/01/28 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
Python中的self用法详解
2019/08/06 Python
python递归下载文件夹下所有文件
2019/08/31 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
python游戏开发的五个案例分享
2020/03/09 Python
jupyter notebook 实现matplotlib图动态刷新
2020/04/22 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
介绍一些UNIX常用简单命令
2014/11/11 面试题
社区活动总结报告
2014/05/05 职场文书
机关作风建设自查报告
2014/10/22 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
军训心得体会范文(2016最新篇)
2016/01/11 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书
django项目、vue项目部署云服务器的详细过程
2022/07/23 Servers