python数据库自动重连_Python mysql(使用pymysql)自动重连

2023-10-26

I'm not sure if this is possible, but I'm looking for a way to reconnect to mysql database when the connection is lost. All the connections are held in a gevent queue but that shouldn't matter I think. I'm sure if I put some time in, I can come up with a way to reconnect to the database. However I was glancing pymysql code and I saw that there is a 'ping' method in Connection class, which I'm not sure exactly how to use.

The method looks like it will reconnect first time but after that it switched the reconnect flag to False again? Can I use this method, or is there a different way to establish connection if it is lost? Even if it is not pymysql how do people tackle, database servers going down and having to re-establish connection to mysql server?

def ping(self, reconnect=True):

''' Check if the server is alive '''

if self.socket is None:

if reconnect:

self._connect()

reconnect = False

else:

raise Error("Already closed")

try:

self._execute_command(COM_PING, "")

return self._read_ok_packet()

except Exception:

if reconnect:

self._connect()

return self.ping(False)

else:

raise

解决方案

Finally got a working solution, might help someone.

from gevent import monkey

monkey.patch_socket()

import logging

import gevent

from gevent.queue import Queue

import pymysql as db

logging.basicConfig(level=logging.DEBUG)

LOGGER = logging.getLogger("connection_pool")

class ConnectionPool:

def __init__(self, db_config, time_to_sleep=30, test_run=False):

self.username = db_config.get('user')

self.password = db_config.get('password')

self.host = db_config.get('host')

self.port = int(db_config.get('port'))

self.max_pool_size = 20

self.test_run = test_run

self.pool = None

self.time_to_sleep = time_to_sleep

self._initialize_pool()

def get_initialized_connection_pool(self):

return self.pool

def _initialize_pool(self):

self.pool = Queue(maxsize=self.max_pool_size)

current_pool_size = self.pool.qsize()

if current_pool_size < self.max_pool_size: # this is a redundant check, can be removed

for _ in xrange(0, self.max_pool_size - current_pool_size):

try:

conn = db.connect(host=self.host,

user=self.username,

passwd=self.password,

port=self.port)

self.pool.put_nowait(conn)

except db.OperationalError, e:

LOGGER.error("Cannot initialize connection pool - retrying in {} seconds".format(self.time_to_sleep))

LOGGER.exception(e)

break

self._check_for_connection_loss()

def _re_initialize_pool(self):

gevent.sleep(self.time_to_sleep)

self._initialize_pool()

def _check_for_connection_loss(self):

while True:

conn = None

if self.pool.qsize() > 0:

conn = self.pool.get()

if not self._ping(conn):

if self.test_run:

self.port = 3306

self._re_initialize_pool()

else:

self.pool.put_nowait(conn)

if self.test_run:

break

gevent.sleep(self.time_to_sleep)

def _ping(self, conn):

try:

if conn is None:

conn = db.connect(host=self.host,

user=self.username,

passwd=self.password,

port=self.port)

cursor = conn.cursor()

cursor.execute('select 1;')

LOGGER.debug(cursor.fetchall())

return True

except db.OperationalError, e:

LOGGER.warn('Cannot connect to mysql - retrying in {} seconds'.format(self.time_to_sleep))

LOGGER.exception(e)

return False

# test (pytest compatible) -------------------------------------------------------------------------------------------

import logging

from src.py.ConnectionPool import ConnectionPool

logging.basicConfig(level=logging.DEBUG)

LOGGER = logging.getLogger("test_connection_pool")

def test_get_initialized_connection_pool():

config = {

'user': 'root',

'password': '',

'host': '127.0.0.1',

'port': 3305

}

conn_pool = ConnectionPool(config, time_to_sleep=5, test_run=True)

pool = conn_pool.get_initialized_connection_pool()

# when in test run the port will be switched back to 3306

# so the queue size should be 20 - will be nice to work

# around this rather than test_run hack

assert pool.qsize() == 20

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python数据库自动重连_Python mysql(使用pymysql)自动重连 的相关文章

  • 通过AI工具(ChatGPT接口)生成一字未改的论文,查重率4.2%,可以直接当作论文使用

    论文题目 基于AIOT技术的能源控制器的设计以及应用 查重结果 4 2 AI工具国内体验 关注 码视野 回复关键字 1002 一 引言 随着全球经济的快速发展和人口的增长 对能源的需求日益增加 然而 能源的消耗不仅增加了人们的负担 还对环境
  • openGL之API学习(二十四)glGetError

    返回opengl操作的错误标志 调用后会将错误标志设置为GL NO ERROR GLenum glGetError void
  • ubuntu16.04 Server版本固定IP地址

    1 打开 etc network interfaces 2 进行下面修改
  • 【微机原理与接口技术】8253+8255实验

    目录 实验内容 1 8253定时实验 利用8253完成1秒的延时 2 利用8253硬件延时控制跑马灯运行 3 8255键盘显示实验 实验内容 1 8253定时实验 利用8253完成1秒的延时 2 利用8253硬件延时控制跑马灯运行 3 82
  • 蓝桥杯——基础——数列排序

    问题描述 给定一个长度为n的数列 将这个数列按从小到大的顺序排列 1 lt n lt 200 输入格式 第一行为一个整数n 第二行包含n个整数 为待排序的数 每个整数的绝对值小于10000 输出格式 输出一行 按从小到大的顺序输出排序后的数
  • 【matlab】matlab算法封装成工具包提供给程序调用

    说明 1 非进程通讯协议 无需在电脑上安装完整版的matlab开发环境 2 本项目以C 为案例 调用的语言不限 操作流程基本相同 一 准备工作 1 安装MATLABWebAppServerSetup集成开发环境 2 安装Visual std
  • 网络综合布线七大子系统详解(图解)

    根据 GB50311 2007 综合布线系统工程设计规范 国家标准规定 网络综合布线七大子系统包括 1 工作区子系统 2 水平子系统 3 垂直子系统 4 管理间子系统 5 设备间子系统 6 进线间子系统 新加的 7 建筑群子系统 工作区子系
  • Unity 2017.3针对相机的DynamicResolution (比如UI分辨率不变,改变3D场景分辨率 来提高性能)

    在之前一种优化方式是改变 屏幕分辨率 https docs unity3d com 2017 3 Documentation ScriptReference Screen resolutions html 在 Unity 2017 3 中增
  • 爬虫实战1-批量获取公开政策文本

    本文未展示图片 可以跳转到我的博客园浏览代码和操作流程 博客园 艽野尘梦 目标 爬取北京市公开发布的所有人才引进相关的政策文本 准备 1 环境 Python 3 7 2 使用 selenium 库中的 webdriver 3 安装对应版本的
  • MAVEN 私有仓库搭建与配置

    一 nexus 下载安装 1 下载 官网地址 https www sonatype com nexus repository oss 由于XXX原因 官网地址可能无法下载 百度网盘 百度网盘 请输入提取码 提取码 ogjf 2 安装 lin
  • docker部署lnmp环境介绍

    lnmp 一 部署lnmp 二 测试nginx和php连接 三 测试php和mysql的连接 一 部署lnmp 1 网络规划 172 16 10 0 24 nginx 172 16 10 10 mysql 172 16 10 20 php
  • C++到底还能做什么?

    嗯 这是一位朋友发到我邮箱里面的 很奇怪 发到了gmail邮箱 而不是我常用的hotmail邮箱哈 我呢 试着回答一下 如果回答得不好 叫做肖某人学艺不精 回去重新学习再来过哈 呵呵 一家之言哈 欢迎拍装 原文如下 肖老师您好 我现在是一名
  • AngularJS 通过事件实现跨作用域传值

    跨作用域传值 跨作用域传值 可以通过 子作用域共同使用父作用域的变量或者使用 单例的service实现 这两种方式 在父级作用域或者 Service 单例的变量值改变的时候 无法实现把值再自动处理赋值给作用域 但是通过事件链 的方式就可以实
  • 页表项长度的计算方法

    Frame Number It gives the frame number in which the current page you are looking for is present The number of bits requi
  • 信息安全概念

    1 信息安全定义 国际标准化组织 lntemational Organization for Standardization IS0 息安全的定义为 为数据处理系统建立和采取技术 管理的安全保护 保护计算机硬件 软件 数据不因偶然的或恶意的
  • 创建一个报表服务器项目,创建报表服务器项目

    创建报表服务器项目 10 17 2017 本文内容 Azure DevOps Server 2020 Azure DevOps Server 2019 TFS 2018 TFS 2013 Azure DevOps Server 以前名为 V
  • 电影下载地址大集合,只要是电影就能找到

    看到很多人都想找一些奇葩 或者国内很少见的电影 你们还在百度 微盘上搜索么 还在人人影视上溜达么 以下收集各大电影网站 绝对能满足你们 如果你不是那么热爱电影 只是闲暇之余看看热门的新片 美剧 不求画质与速度的话 那么下面这几个网站已经能满
  • VB

    文章目录 变量定义 Sub过程 函数定义 控制台输入输出 switch case语句 IF语句 FOR循环语句 不等于 逻辑运算符 控制台输入回车不崩溃函数 获取外部库指针内容放到自定义类中 读ini文件 变量定义 int Dim 变量名
  • 深度学习学习率的调整

    20220626 0 引言 最近在做实验的时候 由于结果一直都不怎么好 我就在想是不是过拟合了 那就算不是过拟合 是不是根本没有学习到数据集中的信息呢 想到了这些事情 我就直接把测试集的效果跟随着训练过程直接打印出来了 当然 实际过程中 肯

随机推荐

  • 1.Linux命令-删除

    Linux的删除命令 在Linux下删除文件 我们使用rm命令 还有搭配相应的参数 具体的选择我们看下面看说明 rm 参数 文件名 参数说明 1 f force 忽略不存在的文件 强制删除 无任何提示 2 i interactive 进行交
  • windows下qtmqtt模块的编译安装-Qt5.12.12

    windows下qtmqtt模块的编译安装 Qt5 12 12 代码获取及编译环境 代码获取 方式1 方式2 配置编译环境 编译安装 代码获取及编译环境 代码获取 方式1 直接git拉取至本地 git clone https github
  • PyTorch显存机制简要分析

    显存开销 显存占用约为element个数的4倍 注意不会将空闲的显存释放 模型参数 模型参数的梯度 优化器状态 跟踪每个权重参数 比如记录动量 中间结果 前向传播时计算的中间结果 显存分析方法 No Nvidia smi PyTorch中即
  • 《JavaScript设计模式》初次笔记——wsdchong

    JavaScript设计模式 初次笔记 前言 设计模式一直久仰大名 但是没有去花时间去了解 于是今天特意花时间去看 JavaScript设计模式 2013年6月出版 和w3cschool上的设计模式 然后做了一些笔记 以 JavaScrip
  • 随机游走序列平稳吗_【问答】时间序列系列(一)—— 平稳序列

    编写 果壳屋 什么是平稳 非平稳序列 如果时间的变化不会导致分布的变化 我们谈论的是分布统计属性 如均值 方差和协方差 我们就把时间序列称为为平稳的 stationary 这并不意味着序列不会随时间而变化 只是它的变化方式本身不会随时间而变
  • mybatis实现继承映射

    ORM 框架的优势在于能让我们利用面向对象的思维去操作数据库 hibernate 作为重量级的 ORM 框架对面向对象的支持很强大 作为半自动化的 mybatis 对面向对象的支持也是很完备的 这篇文章就来讨论一下如何利用 mybatis
  • Vue的路由

    一 Vue的路由 1 路由 路由 从源页面到目的页面的决策过程 2 前端路由 前端路由 在前端页面中维护的路由规则 1 hash 在地址中以 分隔页面 2 history 在地址中以 分隔页面 3 VueRouter路由 VueRouter
  • 今天来聊一聊在人工智能技术发展中起到重要作用的蒸馏算法

    人工智能技术的迅猛发展已经带来了诸多突破和应用 但同时也面临着一些挑战 例如深层网络的复杂性和高计算成本 为了应对这些问题 蒸馏算法作为一种有效的知识传递方法被提出并广泛应用于人工智能领域 本文将深入探讨蒸馏算法的原理 关键技术以及其在人工
  • python的setup.py文件及其常用命令

    http www 2cto com kf 201209 153517 html 编写setup py文件 获取帮助 python setup py help commands python Standard commands build b
  • 【虾说区块链】什么是hash算法?什么是好的hash算法?

    欢迎收听 虾说区块链 现在区块链这个概念在互联网上相当火热 这里简单做一个普及 不涉及项目推广投资 单纯地对区块链相关基础知识概念作一个说明讲解 本人区块链技术爱好者 结合相关区块链资料总结整理了 虾说区块链 也是自己一个学习笔记 涉及相关
  • wireshark提取RTSP over TCP中的视频流

    wireshark提取RTSP over TCP中的视频流 文章目录 wireshark提取RTSP over TCP中的视频流 1 背景 2 提取前准备 3 H264提取步骤 4 后记 1 背景 前面文章中介绍了rtp中提取H264或者H
  • Flutter 之 Mac 环境搭建

    目标 在 Mac 下 搭建 Flutter 运行的 iOS 开发环境 基础环境 要安装并运行 Flutter 您的开发环境必须满足以下最低要求 操作系统 macOS 64 bit 磁盘空间 700 MB 不包括 Xcode 或 Androi
  • Mysql主从复制搭建

    找到cnf文件 root 7103a3767cad which mysqld usr sbin mysqld ns t 7103a3767cad usr sbin mysqld verbose help grep A 1 Default o
  • 杨辉三角的重要结论

    第n行的m个数可表示为 C n 1 m 1 即为从n 1个不同元素中取m 1个元素的组合数 第n行的第m个数和第n m 1个数相等 为组合数性质之一 每个数字等于上一行的左右两个数字之和 可用此性质写出整个杨辉三角 即第n 1行的第i个数等
  • QT信号槽的使用

    QT4 QMetaQbject Connection QObject connect const QObject sender const char signal const QObject receiver const char slot
  • 华三路由追踪命令 tracert详解

    华三路由追踪命令 tracert 此命令用来查看IPv4报文从源端传到目的端所经过的路径 tracert a source ip f first ttl m max ttl p port q packet number t tos topo
  • python csv读取方法及常用的csv读取代码

    csv文件是一种压缩文件格式 在网络上被广泛使用 csv文件在处理时会被转换成二进制文件 其中包含数据 文本和图像等 下面就是我们使用 python读取 csv文件的过程 我们在进行 csv文件读取的时候 一般会有几种方法 1 直接打开文件
  • MyEclipse 导入的项目WEB-INF文件夹变成包的解决方案

    今天 在svn上面download下来的java web项目 然后导入到MyEclipse中 发现所有的目录 WEB INF 其他文件夹都变成package 我开始以为 是MyEclipse出了问题 其实不然 是因为JavaWeb项目中的根
  • 打包好的jar在linux启动,无法打印日志

    使用nohup java jar xxx jar gt log log 2 gt 1 命令启动jar包 打印出来的日志 打印的日志 是由于logback版本过低 logback xml配置中不支持totalSizeCap配置 totalSi
  • python数据库自动重连_Python mysql(使用pymysql)自动重连

    I m not sure if this is possible but I m looking for a way to reconnect to mysql database when the connection is lost Al