给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设计模式之观察者模式实例
Apr 26 Python
python爬虫入门教程之点点美女图片爬虫代码分享
Sep 02 Python
python迭代器实例简析
Sep 25 Python
利用python批量检查网站的可用性
Sep 09 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
如何在Cloud Studio上执行Python代码?
Aug 09 Python
wxPython实现文本框基础组件
Nov 18 Python
python实现简单的购物程序代码实例
Mar 03 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 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使用MySQL保存session会话的方法
2015/06/26 PHP
php实现SAE上使用storage上传与下载文件的方法
2015/06/29 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
2015/07/01 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
深入剖析javascript中的exec与match方法
2016/05/18 Javascript
Javascript中的arguments对象
2016/06/20 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
BootStrap便签页的简单应用
2017/01/06 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
利用node.js实现自动生成前端项目组件的方法详解
2017/07/12 Javascript
Vue请求JSON Server服务器数据的实现方法
2018/11/02 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
Python格式化css文件的方法
2015/03/10 Python
人工智能最火编程语言 Python大战Java!
2017/11/13 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
Python中存取文件的4种不同操作
2018/07/02 Python
python3正则模块re的使用方法详解
2020/02/11 Python
python各种excel写入方式的速度对比
2020/11/10 Python
2014年民主评议党员个人总结
2014/09/24 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
单位收入证明范本
2015/06/18 职场文书