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使用urllib2获取网络资源实例讲解
Dec 02 Python
python遍历文件夹并删除特定格式文件的示例
Mar 05 Python
python单线程实现多个定时器示例
Mar 30 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
Python加载带有注释的Json文件实例
May 23 Python
浅谈pytorch和Numpy的区别以及相互转换方法
Jul 26 Python
python批量爬取下载抖音视频
Jun 17 Python
对Django中内置的User模型实例详解
Aug 16 Python
python队列原理及实现方法示例
Nov 27 Python
Python短信轰炸的代码
Mar 25 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
python实现控制台输出颜色
Mar 02 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获取YouTube视频信息的方法
2015/02/11 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
HTML5附件拖拽上传drop &amp; google.gears实现代码
2011/04/28 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
javascript中Function类型详解
2015/04/28 Javascript
JS自定义选项卡函数及用法实例分析
2015/09/02 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
vue props对象validator自定义函数实例
2019/11/13 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
Python版的文曲星猜数字游戏代码
2013/09/02 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
详解Python学习之安装pandas
2019/04/16 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
巴西网上药房:onofre
2016/11/21 全球购物
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
香港士多网上超级市场:Ztore
2021/01/09 全球购物
AURALog面试题软件测试方面
2013/10/22 面试题
超市5.1促销活动
2014/01/15 职场文书
函授本科自我鉴定
2014/02/04 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
顶岗实习计划书
2015/01/16 职场文书
品质保证书格式
2015/02/28 职场文书
基石观后感
2015/06/12 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书
Redis Cluster 集群搭建你会吗
2021/08/04 Redis