python mysql断开重连的实现方法


Posted in Python onJuly 26, 2019

后台服务在运行时发现一个问题,运行约15分钟后,接口请求报错

pymysql.err.InterfaceError: (0, '')

这个错误提示一般发生在将None赋给多个值,定位问题时发现

pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')

如何解决这个问题呢

出现问题的代码

class MysqlConnection(object):

	"""
	mysql操作类,对mysql数据库进行增删改查
	"""

	def __init__(self, config):
		# Connect to the database
		self.connection = pymysql.connect(**config)
		self.cursor = self.connection.cursor()

	def Query(self, sql):
		"""
		查询数据
		:param sql:
		:return:
		"""
		self.cursor.execute(sql)
		return self.cursor.fetchall()

在分析问题前,先看看Python 数据库的Connection、Cursor两大对象

Python 数据库图解流程

python mysql断开重连的实现方法

Connection、Cursor形象比喻

python mysql断开重连的实现方法

Connection()的参数列表

  • host,连接的数据库服务器主机名,默认为本地主机(localhost)
  • user,连接数据库的用户名,默认为当前用户
  • passwd,连接密码,没有默认值
  • db,连接的数据库名,没有默认值
  • conv,将文字映射到Python类型的字典
  • cursorclass,cursor()使用的种类,默认值为MySQLdb.cursors.Cursor
  • compress,启用协议压缩功能
  • named_pipe,在windows中,与一个命名管道相连接
  • init_command,一旦连接建立,就为数据库服务器指定一条语句来运行
  • read_default_file,使用指定的MySQL配置文件
  • read_default_group,读取的默认组
  • unix_socket,在unix中,连接使用的套接字,默认使用TCP
  • port,指定数据库服务器的连接端口,默认是3306

python mysql断开重连的实现方法

connection对象支持的方法

python mysql断开重连的实现方法

Cursor对象支持的方法

用于执行查询和获取结果

python mysql断开重连的实现方法

execute方法:执行SQL,将结果从数据库获取到客户端

python mysql断开重连的实现方法

调试代码,将超时时间设置较长

self.connection._write_timeout = 10000

发现并没有生效

使用try...except... 方法捕获失败后重新连接数据库

try:
	self.cursor.execute(sql)
except:
	self.connection()
	self.cursor.execute(sql)

直接抛出异常,并没有执行except代码段

打印self.connection ,输出如下:

<pymysql.connections.Connection object at 0x0000000003E2CCC0>

抛出异常重新connect是不行的,因为connections 仍存在未失效

找到一种方法可以解决问题,在每次连接之前,判断该链接是否有效,pymysql提供的接口是 Connection.ping()

这个该方法的源码

def ping(self, reconnect=True):
    """Check if the server is alive"""
    if self._sock is None:
      if reconnect:
        self.connect()
        reconnect = False
      else:
        raise err.Error("Already closed")
    try:
      self._execute_command(COMMAND.COM_PING, "")
      return self._read_ok_packet()
    except Exception:
      if reconnect:
        self.connect()
        return self.ping(False)
      else:
        raise

在每次请求数据库前执行如下代码

def reConnect(self):
	try:
		self.connection.ping()
	except:
		self.connection()

不过这样的方式虽然能解决问题,但是感觉相对较low,希望有更好的处理方法

目前已实现的数据库查询这部分的代码

import pymysql
class DBManager(object):

  def __init__(self,config):
    self.connection = pymysql.connect(**config) # config为数据库登录验证配置信息
    self.cursor = self.connection.cursor()

  def query(self, sql, params):
    try:
      with self.connection.cursor() as cursor:
        cursor.execute(sql, params)
        result = cursor.fetchall()
        self.connection.commit()
        return result
        # self.connection.close()
    except Exception as e:
      traceback.print_exc()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python字典操作简明总结
Apr 13 Python
详解在Python程序中使用Cookie的教程
Apr 30 Python
Python使用zip合并相邻列表项的方法示例
Mar 17 Python
浅谈python的dataframe与series的创建方法
Nov 12 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
基于keras 模型、结构、权重保存的实现
Jan 24 Python
keras获得某一层或者某层权重的输出实例
Jan 24 Python
Python使用Paramiko控制liunx第三方库
May 20 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
Python 解析简单的XML数据
Jul 24 Python
浅析Python模块之间的相互引用问题
Feb 26 Python
python3实现常见的排序算法(示例代码)
Jul 04 Python
seek引发的python文件读写的问题及解决
Jul 26 #Python
python经典趣味24点游戏程序设计
Jul 26 #Python
对django后台admin下拉框进行过滤的实例
Jul 26 #Python
python函数的万能参数传参详解
Jul 26 #Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 #Python
Django REST Framework序列化外键获取外键的值方法
Jul 26 #Python
django admin.py 外键,反向查询的实例
Jul 26 #Python
You might like
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
老生常谈文本文件和二进制文件的区别
2017/02/27 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
js中精确计算加法和减法示例
2014/03/28 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
javascript中this用法实例详解
2017/04/06 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
python获取糗百图片代码实例
2013/12/18 Python
python数据结构之链表详解
2017/09/12 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
维多利亚的秘密阿联酋官网:Victoria’s Secret阿联酋
2019/12/07 全球购物
Unix里面如何在后台运行程序
2016/10/14 面试题
个人简历自我鉴定
2013/10/11 职场文书
初入社会应届生求职信
2013/11/18 职场文书
大课间体育活动方案
2014/03/12 职场文书
python_tkinter弹出对话框创建
2022/03/20 Python