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的Flask框架结合MySQL写一个内存监控程序
Nov 07 Python
批处理与python代码混合编程的方法
May 19 Python
Python标准库inspect的具体使用方法
Dec 06 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 Python
python使用thrift教程的方法示例
Mar 21 Python
Django框架中间件(Middleware)用法实例分析
May 24 Python
win10下python2和python3共存问题解决方法
Dec 23 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
Python StringIO及BytesIO包使用方法解析
Jun 15 Python
Prometheus开发中间件Exporter过程详解
Nov 30 Python
python 获取谷歌浏览器保存的密码
Jan 06 Python
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
Oct 16 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
php5 mysql分页实例代码
2008/04/10 PHP
php之readdir函数用法实例
2014/11/13 PHP
php中final关键字用法分析
2016/12/07 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
2017/07/13 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
深入理解Node module模块
2018/03/26 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
使用jQuery实现购物车
2020/10/29 jQuery
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
python二维键值数组生成转json的例子
2019/12/06 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
PHP如何与mysql建立链接
2013/05/05 面试题
super()与this()的区别
2016/01/17 面试题
类、抽象类、接口的差异
2016/06/13 面试题
研究生毕业鉴定
2014/01/29 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
安全生产培训心得体会
2016/01/18 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android