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为tornado添加recaptcha验证码功能
Feb 26 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
Mar 13 Python
python入门基础之用户输入与模块初认识
Nov 14 Python
解决uWSGI的编码问题详解
Mar 24 Python
Python生成器定义与简单用法实例分析
Apr 30 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
在Python中调用Ping命令,批量IP的方法
Jan 26 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
Aug 06 Python
解析PyCharm Python运行权限问题
Jan 08 Python
python使用for...else跳出双层嵌套循环的方法实例
May 17 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
Mar 03 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使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
php session的应用详细介绍
2017/03/22 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
Javascript学习笔记之相等符号与严格相等符号
2014/11/23 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
老生常谈js数据类型
2017/08/03 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
javascript中正则表达式语法详解
2020/08/07 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
详谈Python高阶函数与函数装饰器(推荐)
2017/09/30 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
python数据化运营的重要意义
2019/11/25 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
Python错误的处理方法
2020/06/23 Python
Python如何执行系统命令
2020/09/23 Python
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
门店业绩提升方案
2014/06/08 职场文书
英语教研活动总结
2014/07/02 职场文书
新兵入伍心得体会
2014/09/04 职场文书
财务审计整改报告
2014/11/06 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
银行求职信范文
2019/05/13 职场文书
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL
通过Python把学姐照片做成拼图游戏
2022/02/15 Python
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS
table不让td文字溢出操作方法
2022/12/24 HTML / CSS