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 相关文章推荐
python3+PyQt5实现使用剪贴板做复制与粘帖示例
Jan 24 Python
python交互式图形编程实例(一)
Nov 17 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
DES加密解密算法之python实现版(图文并茂)
Dec 06 Python
Python的Tkinter点击按钮触发事件的例子
Jul 19 Python
python flask搭建web应用教程
Nov 19 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
Django认证系统user对象实现过程解析
Mar 02 Python
pandas数据拼接的实现示例
Apr 16 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
如何把python项目部署到linux服务器
Aug 26 Python
jupyter notebook指定启动目录的方法
Mar 02 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开发环境配置记录
2011/01/14 PHP
sphinx增量索引的一个问题
2011/06/14 PHP
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
js实现倒计时(距离结束还有)示例代码
2013/07/24 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
JS调用打印机功能简单示例
2016/11/28 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
Vue实现图书管理案例
2021/01/20 Vue.js
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
python2与python3共存问题的解决方法
2018/09/18 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
《小小雨点》教学反思
2014/02/18 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript