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中的CURL PycURL使用例子
Jun 01 Python
用Python制作简单的朴素基数估计器的教程
Apr 01 Python
python3实现短网址和数字相互转换的方法
Apr 28 Python
RC4文件加密的python实现方法
Jun 30 Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 Python
python实现获取Ip归属地等信息
Aug 27 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 Python
python实现的汉诺塔算法示例
Oct 23 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
Jan 14 Python
tensorflow 实现数据类型转换
Feb 17 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中进行身份认证
2006/10/09 PHP
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
php5.3 注意事项说明
2013/07/01 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
2015/12/18 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
JS错误处理与调试操作实例分析
2020/04/13 Javascript
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
Python中遍历列表的方法总结
2019/06/27 Python
Django logging配置及使用详解
2019/07/23 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
5款实用的python 工具推荐
2020/10/13 Python
基于python模拟TCP3次握手连接及发送数据
2020/11/06 Python
护理学毕业生自荐信
2013/10/02 职场文书
团组织关系介绍信
2014/01/12 职场文书
买卖车协议书
2014/04/21 职场文书
个人承诺书格式
2014/06/03 职场文书
2014光棍节大学生联谊活动方案
2014/10/10 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python