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 23 Python
python使用线程封装的一个简单定时器类实例
May 16 Python
python 上下文管理器使用方法小结
Oct 10 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
将Dataframe数据转化为ndarry数据的方法
Jun 28 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
python中的列表与元组的使用
Aug 08 Python
Django REST framwork的权限验证实例
Apr 02 Python
python爬虫容易学吗
Jun 02 Python
解决python对齐错误的方法
Jul 16 Python
python os.rename实例用法详解
Dec 06 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
redis 队列操作的例子(php)
2012/04/12 PHP
php定界符
2014/06/19 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
Javascript执行效率全面总结
2013/11/04 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
Python入门教程之运算符与控制流
2016/08/17 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
Python开发之pip安装及使用方法详解
2020/02/21 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
你常见到的runtime exception
2016/09/05 面试题
挑战杯创业计划书的写作指南
2014/01/07 职场文书
自我评价的范文
2014/02/02 职场文书
40岁生日感言
2014/02/15 职场文书
认识深刻的检讨书
2014/02/16 职场文书
简易离婚协议书(范本)
2014/10/25 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
任长霞观后感
2015/06/16 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
2016入党心得体会范文
2016/01/06 职场文书
Python中Permission denied的解决方案
2021/04/02 Python