给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实现bitmap数据结构详解
Feb 17 Python
在Django框架中编写Contact表单的教程
Jul 17 Python
使用python在本地电脑上快速处理数据
Jun 22 Python
python使用opencv读取图片的实例
Aug 17 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
python实现报表自动化详解
Nov 16 Python
Python 使用类写装饰器的小技巧
Sep 30 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
python实现知乎高颜值图片爬取
Aug 12 Python
在python里创建一个任务(Task)实例
Apr 25 Python
关于python的缩进规则的知识点详解
Jun 22 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
Dec 05 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
桌面中心(四)数据显示
2006/10/09 PHP
浅析Yii2 GridView实现下拉搜索教程
2016/04/22 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
详解angularjs popup-table 弹出框表格指令
2017/09/20 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
python实现探测socket和web服务示例
2014/03/28 Python
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
Python批量更改文件名的实现方法
2017/10/29 Python
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
Python设计模式之建造者模式实例详解
2019/01/17 Python
Django工程的分层结构详解
2019/07/18 Python
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
2014年党员整改措施范文
2014/09/21 职场文书
2015年公司新年寄语
2014/12/08 职场文书
八一建军节慰问信
2015/02/14 职场文书