PyMySQL连接池

背景

  • 在用python写后端服务时候,需要与mysql数据库进行一些数据查询或者插入更新等操作。启动服务后接口运行一切正常,
    隔了第二天去看服务日志就会报错,问题如下:
pymysql.err.OperationalError: (2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))")
  • MySQL默认的wait_timeout时间28800秒,即8小时,超过8小时,MySQL就会放弃连接。MySQL默认设置的时间是8小时,可以通过运行show variables like ‘%timeout%’;这个SQL即可查看到,时间根据自己业务而定。
  • 对于数据库连接,一般不建议使用全局变量,在每次操作完成后即关闭连接。这是因为长时间保持数据库连接会对性能和资源消耗产生负面影响。与此相反,使用数据库连接池来维护和分配数据库连接是更好的做法。

好处

连接池的优点是可以在多个线程或进程之间共享,并且可以有效地管理连接数,而无需手动打开和关闭连接。

常用包

  • QueuePool 是 SQLAlchemy 内置的一个连接池实现,它可以管理一个连接队列,确保每个连接在使用后被适当地关闭。该池使用Python 自带的 queue 模块实现,并支持可配置的最大连接数、预处理语句等特性。优点是易于使用,无需其他依赖,并与SQLAlchemy 之间无缝集成。
  • PooledDB 是 DBUtils 库提供的一个连接池实现,可以与 SQLAlchemy 或其他 Python数据库库一起使用。它支持多种类型的连接池,并使用 threading模块实现线程安全,具有更高的性能和稳定性。该库还提供了一些方便的功能,例如自动回收空闲连接等。

pip install dbutils==1.3 

DBUtils python 代码

import os
import pymysql
import configparser
from DBUtils.PooledDB import PooledDBdef get_mysql_config():MODULE_REAL_DIR = os.path.dirname(os.path.realpath(__file__))config = configparser.ConfigParser()config.read(MODULE_REAL_DIR + '/../conf/config.conf')host = config.get('MYSQL_FORMAL_DB', '127.0.0.1')port = config.get('MYSQL_FORMAL_DB', '3306')user = config.get('MYSQL_FORMAL_DB', 'root')pwd = config.get('MYSQL_FORMAL_DB', 'mypwd')db = config.get('MYSQL_FORMAL_DB', 'mydb')return host, port,user, password, databasehost, port, user, password, database = get_mysql_config()class MySQLConnectionPool:def __init__(self,):self.pool = PooledDB(creator=pymysql,  # 使用链接数据库的模块mincached=10,  # 初始化时,链接池中至少创建的链接,0和None表示不创建maxcached=5,  # 链接池中最多闲置的链接,0和None不限制maxconnections=200,  # 连接池允许的最大连接数,0和None表示不限制连接数maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]ping=0,# ping MySQL服务端,检查是否服务可用。# 如:0 = None = never,# 1 = default = whenever it is requested,# 2 = when a cursor is created,# 4 = when a query is executed,# 7 = alwayshost=host,port=port,user=user,password=password,database=database,charset='utf8')def open(self):self.conn = self.pool.connection()self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)  # 表示读取的数据为字典类型return self.conn, self.cursordef close(self, cursor, conn):cursor.close()conn.close()def select_one(self, sql, *args):"""查询单条数据"""conn, cursor = self.open()cursor.execute(sql, args)result = cursor.fetchone()self.close(conn, cursor)return resultdef select_all(self, sql, args):"""查询多条数据"""conn, cursor = self.open()cursor.execute(sql, args)result = cursor.fetchall()self.close(conn, cursor)return resultdef insert_one(self, sql, args):"""插入单条数据"""self.execute(sql, args, isNeed=True)def insert_all(self, sql, datas):"""插入多条批量插入"""conn, cursor = self.open()try:cursor.executemany(sql, datas)conn.commit()return {'result': True, 'id': int(cursor.lastrowid)}except Exception as err:conn.rollback()return {'result': False, 'err': err}def update_one(self, sql, args):"""更新数据"""self.execute(sql, args, isNeed=True)def delete_one(self, sql, *args):"""删除数据"""self.execute(sql, args, isNeed=True)def execute(self, sql, args, isNeed=False):"""执行:param isNeed 是否需要回滚"""conn, cursor = self.open()if isNeed:try:cursor.execute(sql, args)conn.commit()except:conn.rollback()else:cursor.execute(sql, args)conn.commit()self.close(conn, cursor)"""
CREATE TABLE `names` (`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',`name` VARCHAR(30) DEFAULT NULL COMMENT '姓名',`sex` VARCHAR(20) DEFAULT NULL COMMENT '性别',`age` int(5) DEFAULT NULL COMMENT '年龄',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='数据导入mysql';"""mysql = MySQLConnectionPool()sql_insert_one = "insert into `names` (`name`, sex, age) values (%s,%s,%s)"
mysql.insert_one(sql_insert_one, ('唐三', '男', 25))datas = [('戴沐白', '男', 26),('奥斯卡', '男', 26),('唐三', '男', 25),('小舞', '女', 100000),('马红俊', '男', 23),('宁荣荣', '女', 22),('朱竹清', '女', 21),
]
sql_insert_all = "insert into `names` (`name`, sex, age) values (%s,%s,%s)"
mysql.insert_all(sql_insert_all, datas)sql_update_one = "update `names` set age=%s where `name`=%s"
mysql.update_one(sql_update_one, (28, '唐三'))sql_delete_one = 'delete from `names` where `name`=%s '
mysql.delete_one(sql_delete_one, ('唐三',))sql_select_one = 'select * from `names` where `name`=%s'
results = mysql.select_one(sql_select_one, ('唐三',))
print(results)sql_select_all = 'select * from `names` where `name`=%s'
results = mysql.select_all(sql_select_all, ('唐三',))
print(results)

目前最新版本是3.1.0, 官方文档: https://webwareforpython.github.io/DBUtils/main.html

模块中的类 PooledDB dbutils.pooled_db实现池 与数据库的稳定、线程安全的缓存连接,这些连接是透明的 使用任何 DB-API 2 数据库模块重用。

下图显示了当您 正在使用pooled_db连接:
在这里插入图片描述

PooledDB (pooled_db) 参数:

  • creator:返回新 DB-API 2 的任意函数 连接对象或符合 DB-API 2 的数据库模块

  • mincached :池中的初始空闲连接数 (默认值为 0 表示启动时未建立任何连接)

  • maxcached:池中的最大空闲连接数 (默认值 0 或 None 表示池大小不受限制)

  • MaxShared:允许的最大共享连接数 (默认值 0 或 None 表示所有连接都是专用的)。当达到此最大数量时,如果连接 已被要求为可共享。

  • maxconnections:通常允许的最大连接数 (默认值 0 或 None 表示任意数量的连接)

  • blocking:确定超过最大值时的行为。如果设置为 true,则阻止并等待 连接数减少,但默认情况下会报告错误。

maxusage:单个连接的最大重用次数 (默认值为 0 或 None 表示无限重用)。当达到连接的最大使用次数时, 连接将自动重置(关闭并重新打开)。

setsession:可用于 准备会话,例如 [“将 datestyle 设置为德语”,…]

reset:返回到池时应如何重置连接 (False 或 None 回滚以 begin() 开头的事务, 为了安全起见,默认值 True 始终发出回滚)

failures:可选的异常类或异常类的元组 应应用连接故障转移机制, 如果默认值 (OperationalError, InterfaceError,InternalError) 对于使用的数据库模块来说是不够的

ping:控制何时检查连接的可选标志 如果这样的方法可用,则使用 ping() 方法 (0 = 无 = 从不,1 = 默认值 = 从池中获取的时间,2 = 创建游标时,4 = 执行查询时,7 = 始终,以及这些值的所有其他位组合)

符合 DB-API 2 的 creator 函数或 connect 函数 指定为创建者的数据库模块将收到任何其他 主机、数据库、用户、密码等参数。你可以 在您自己的 creator 函数中选择部分或全部这些参数, 支持复杂的故障转移和负载平衡机制。


参考

Python连接MySQL数据库连接池
python DbUtils 封装
Python+Pymysql+PooledDB实现数据库连接池
Pymysql 连接池操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/18848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript-内存分配

内存空间 内存分为栈和堆 栈:由操作系统自动释放存放的变量值和函数值等。简单数据类型存放在栈中 栈会由低到高先入后出 堆:存储引用类型 (对象) 对象会先将数据存放在堆里面,堆的地址放在栈里面

数字孪生智慧车站:全方位可视化管理平台

运用图扑数字孪生技术,智慧车站可视化管理平台实时模拟并监控车站运行状态,通过整合即时数据与历史数据,提供精准分析和预测。该平台支持乘客流量管理、设备运行监控、安全预警等多项功能,提高车站运营效率与安全性。直观的可视化…

这个橙子真的香!老司机徒手把玩香橙派Kunpeng Pro事后回忆录

说!你是哪个门派? 香橙,芸香科柑橘属小乔木。枝通常有粗长刺,新梢及嫩叶柄常被疏短毛。叶厚纸质,翼叶倒卵状椭圆形,顶部圆或钝。。。 咦?小李?我们不是搞IT的嘛,怎么会有…

(函数)求一元二次方程的根(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>//声明函数&#xff1b; //判断条件等于0时&#xff1b; void zeor(double a, double b);//判断条件大于0时&#xff1b; void bigzeo…

浅谈 parallelStream和Stream 源码及其应用场景

上篇讲述了list.forEach()和list.stream().forEach() 异同点 谈到了并行流的概念&#xff0c;本篇则从源码出发&#xff0c;了解一下其原理。 一、流的初始操作流程 jdk8中 将Collection中加入了转换流的概念。 default Stream<E> stream() {return StreamSupport.str…

第十三章 进程与线程

第十三章 进程与线程 程序与进程的概念 程序&#xff1a; 英文单词为Program&#xff0c;是指一系列有序指令的集合&#xff0c;使用编程语言所编写&#xff0c;用于实现一定的功能。 进程&#xff1a; 进程则是指启动后的程序&#xff0c;系统会为进程分配内存空间。 函数式…

【PingPong_注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

奶奶也能看懂的耦合协调度分析

不会计算&#xff1f;跟着文献学起来~ 案例数据连接&#xff08;复制链接后粘贴到浏览器中&#xff09;&#xff1a; 耦合协调度数据​spssau.com/spssaudata.html?shareDataF363000CD033FF15E557BB75B9B0D412 假如你有这样一组数据&#xff1a; 如何进行计算分析耦合协调度…

内网安全之证书模版的管理

证书模板 Certificate templates 是 CA 证书颁发机构的一个组成部分&#xff0c;是证书策略中的重要元素&#xff0c;是用于证书注册、使用和管理的一组规则和格式。当 CA 收到对证书的请求时&#xff0c;必须对该请求应用一组规则和设置&#xff0c;以执行所请求的功能&#x…

前端知识1-4:性能优化进阶

性能优化进阶 Navigation Timing API navigationStart / end 表示从上一个文档卸载结束时 > 如果没有上一个文档&#xff0c;这个值和fetchStart相等 unloadEventStart / end 标识前一个网页unload的时间点 redirectStart / end 第一个http重定向发生和结束的时间 fetch…

Hadoop3:HDFS中DataNode与NameNode的工作流程

一、DataNode中的数据情况 数据位置 /opt/module/hadoop-3.1.3/data/dfs/data/current/BP-823420375-192.168.31.102-1714395693863/current/finalized/subdir0/subdir0块信息 每个块信息&#xff0c;由两个文件保存&#xff0c;xxx.meta保存的是数据长度、校验和、时间戳&am…

芝加哥大学最新研究:GPT-4与财务预测,重塑财务分析的未来

最近&#xff0c;芝加哥大学的研究团队发表了一篇突破性的研究&#xff0c;展示了大型语言模型&#xff08;LLM&#xff09;&#xff0c;特别是 OpenAI 开发的 GPT-4&#xff0c;如何在财务报表分析领域取得了与专业分析师相匹配甚至超越的表现。这项研究不仅凸显了人工智能在高…

GDPU Java 天码行空13

&#xff08;一&#xff09;实验目的 1、掌握JAVA中与网络程序开发相关的知识点&#xff1b; 2、理解并掌握网络编程开发思想及方法&#xff1b; 3、熟悉项目开发的分包方法和依据&#xff1b; 4、实现聊天室中客服端和服务器端的实现方法&#xff1b; 5、熟悉多线程程序开发方…

Kinetix5700罗克韦尔AB伺服驱动器维修2198-D020-ERS3

Allen-Bradley罗克韦尔运动控制/伺服驱动器维修Kinetix 5700/Kinetix 6000/Kinetix 5500等系列电机驱动器/运动控制系统维修。 AB驱动器的控制接口有两种类型&#xff1a; 类型1&#xff1a;脉冲接口 类型2&#xff1a;模拟量接口 大部分小型PLC和伺服驱动器的链接方式都是开…

通过vlan实现同一网段下的网络隔离

现有两个电脑通过交换机直接连接在一起 pc1&#xff1a; pc2&#xff1a; 正常状态下是可以ping成功的 现在先进入交换机命令行界面&#xff0c;创建两个vlan <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]vlan 10 [Huawei-vlan10…

2024年西安交通大学程序设计校赛

A题 签到题 代码如下 //A #include<iostream> #include<algorithm> #define int long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); using namespace std; signed main() {IOSint a,b,c,d;cin>>a>>b>>c…

二叉树介绍及堆

文章目录 树 概念及结构 二叉树 概念及结构 特殊的二叉树 完全二叉树 满二叉树 性质 储存 顺序存储 链式储存 堆 概念及结构 小堆 大堆 建堆 向上调整建堆 向下调整建堆 TOPK问题 法一&#xff1a; 法二&#xff1a; 树 概念及结构 树是一种非线性的数据…

解决word里加入mathtype公式后行间距变大

1.布局>页面设置>文档网格&#xff0c;网格栏选为无网格 2.固定间距

探索标准差与方差的奥秘

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、标准差与方差的基础理解 代码案例 二、标准差与方差的计算方法 方差的计算 标准差的…

QT——QSlider实现,QT滑动控件的使用

目录 简介滑动块调节两种方法滑动条触发信号量理想滑动块运用&#xff08;参考&#xff09; 简介 QT中滑动条的控件叫QSlider&#xff0c;继承自QAbstractSlider类。 主要用途是通过滑块的滑动的方式在一定范围内调节某个值。根据调节的后得到的结果去执行一些处理&#xff0c…