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实现抓取城市的PM2.5浓度和排名
Mar 19 Python
Python中的ceil()方法使用教程
May 14 Python
python中list常用操作实例详解
Jun 03 Python
Python实现k-means算法
Feb 23 Python
对Python3中的print函数以及与python2的对比分析
May 02 Python
Python小进度条显示代码
Mar 05 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 Python
python实现桌面托盘气泡提示
Jul 29 Python
Python高级特性 切片 迭代解析
Aug 23 Python
Python批量处理csv并保存过程解析
May 16 Python
python爬取2021猫眼票房字体加密实例
Feb 19 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 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+Html+缓存
2006/11/25 PHP
SMARTY学习手记
2007/01/04 PHP
用PHP为SHOPEX增加日志功能代码
2010/07/02 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
2013/08/07 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
如何用js控制css中的float的代码
2007/08/16 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
JS拖动技术 关于setCapture使用
2010/12/09 Javascript
js两行代码按指定格式输出日期时间
2011/10/21 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
jQuery实现手机号正则验证输入及自动填充空格功能
2018/01/02 jQuery
详解Angular5 服务端渲染实战
2018/01/04 Javascript
vue this.reload 方法 配置
2018/09/12 Javascript
JavaScript两种计时器的实例讲解
2019/01/31 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
详解Django配置JWT认证方式
2020/05/09 Python
Python如何读写二进制数组数据
2020/08/01 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
十八大演讲稿
2014/05/22 职场文书
师范生见习报告
2014/10/31 职场文书
教师评职称工作总结2015
2015/04/20 职场文书
科技活动总结范文
2015/05/11 职场文书
python函数的两种嵌套方法使用
2022/04/02 Python