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 获取新浪微博的最新公共微博实例分享
Jul 03 Python
常见的在Python中实现单例模式的三种方法
Apr 08 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
Jun 23 Python
pygame实现弹力球及其变速效果
Jul 03 Python
Windows环境下python环境安装使用图文教程
Mar 13 Python
python Django的web开发实例(入门)
Jul 31 Python
OpenCV模板匹配matchTemplate的实现
Oct 18 Python
TFRecord文件查看包含的所有Features代码
Feb 17 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
python制作一个简单的gui 数据库查询界面
Nov 19 Python
python通用数据库操作工具 pydbclib的使用简介
Dec 21 Python
在 Golang 中实现 Cache::remember 方法详解
Mar 30 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 array_walk() 数组函数
2011/07/12 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
2017/08/15 PHP
php对象工厂类完整示例
2018/08/09 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
js实现图片无缝滚动
2015/12/23 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
在vue中使用公共过滤器filter的方法
2018/06/26 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
python批量修改文件后缀示例代码分享
2013/12/24 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
html如何对span设置宽度
2019/10/30 HTML / CSS
香港交友网站:be2香港
2018/07/22 全球购物
创伤外科专业推荐信范文
2013/11/19 职场文书
商务会议邀请函
2014/01/09 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
进步之星获奖感言
2014/02/22 职场文书
2014年党员个人工作总结
2014/12/02 职场文书
高三数学复习备考教学反思
2016/02/18 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
python爬虫请求库httpx和parsel解析库的使用测评
2021/05/10 Python
CSS的calc函数用法小结
2022/06/25 HTML / CSS