给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中is和id的用法
Apr 03 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
Apr 17 Python
浅谈python的输入输出,注释,基本数据类型
Apr 02 Python
python os.path.isfile()因参数问题判断错误的解决
Nov 29 Python
详解python 中in 的 用法
Dec 12 Python
python 实现将list转成字符串,中间用空格隔开
Dec 25 Python
Python计算指定日期是今年的第几天(三种方法)
Mar 26 Python
python 简单的调用有道翻译
Nov 25 Python
只用50行Python代码爬取网络美女高清图片
Jun 02 Python
python 管理系统实现mysql交互的示例代码
Dec 06 Python
python实现对doc、txt、xls等文档的读写操作
Apr 02 Python
Python matplotlib多个子图绘制整合
Apr 13 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 Xdebug的安装与使用详解
2013/06/20 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
jquery中EasyUI实现同步树
2015/03/01 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
JS不完全国际化&amp;本地化手册 之 理论篇
2016/09/27 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
Python contextlib模块使用示例
2015/02/18 Python
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
2018/01/30 Python
python文本数据相似度的度量
2018/03/12 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
pip安装python库的方法总结
2019/08/02 Python
Python函数参数分类原理详解
2020/05/28 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
如何开启linux的ssh服务
2013/06/03 面试题
个性大学生自我评价
2013/12/04 职场文书
六查六看剖析材料
2014/02/15 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
升职感谢信
2015/01/22 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书