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类参数self使用示例
Feb 17 Python
python列表操作使用示例分享
Feb 21 Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
python简单商城购物车实例代码
Mar 15 Python
python socket网络编程之粘包问题详解
Apr 28 Python
Python闭包思想与用法浅析
Dec 27 Python
python中时间模块的基本使用教程
May 14 Python
python进程和线程用法知识点总结
May 28 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 Python
解决pytorch 的state_dict()拷贝问题
Mar 03 Python
Python Django框架介绍之模板标签及模板的继承
May 27 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初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
一个典型的PHP分页实例代码分享
2011/07/28 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
JS画线(实例代码)
2013/11/20 Javascript
jQuery实现文本框邮箱输入自动补全效果
2015/11/17 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
关于微信jssdk实现多图片上传的一点心得分享
2016/12/13 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
python模块restful使用方法实例
2013/12/10 Python
python用字典统计单词或汉字词个数示例
2014/04/22 Python
python中实现定制类的特殊方法总结
2014/09/28 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
实用自动化运维Python脚本分享
2018/06/04 Python
对python sklearn one-hot编码详解
2018/07/10 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
tensorflow查看ckpt各节点名称实例
2020/01/21 Python
html5中使用hotcss.js实现手机端自适配的方法
2020/04/23 HTML / CSS
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
长青弘远的面试题
2012/06/09 面试题
小学生自我评价100字(15篇)
2014/09/18 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis