Python数据库连接池 -组件 DBUtils
2023-09-11 14:18:39 时间
DBUtils是Python的一个用于实现数据库连接池的模块
此连接池有两种连接模式:
DBUtils提供两种外部接口:
PersistentDB :提供线程专用的数据库连接,并自动管理连接。
PooledDB :提供线程间可共享的数据库连接,并自动管理连接。
PersistentDB 模式
为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把链接重新放到链接池,供自己线程再次使用,当线程终止时,链接自动关闭
from DBUtils.PersistentDB import PersistentDB import pymysql POOL = PersistentDB( creator=pymysql, # 使用链接数据库的模块 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 setsession=[], # 开始会话前执行的命令列表。 ping=0, # ping MySQL服务端,检查是否服务可用。 closeable=False, # 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接) threadlocal=None, # 本线程独享值得对象,用于保存链接对象,如果链接对象被重置 host='127.0.0.1', port=3306, user='root', password='123456', database='test', charset='utf8' ) def func(): conn = POOL.connection(shareable=False) cursor = conn.cursor() cursor.execute('select * from user') result = cursor.fetchall() print(result) cursor.close() conn.close() if __name__ == '__main__': func()
PooledDB 模式
创建一批连接到连接池,供所有线程共享使用。
import pymysql from DBUtils.PooledDB import PooledDB POOL = PooledDB( creator=pymysql, # 使用链接数据库的模块 maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数 mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建 maxcached=5, # 链接池中最多闲置的链接,0和None不限制 maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。 blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 setsession=[], # 开始会话前执行的命令列表。 ping=0, # ping MySQL服务端,检查是否服务可用。 host='127.0.0.1', port=3306, user='root', password='123456', database='test', charset='utf8' ) def func(): # 检测当前正在运行连接数的是否小于最大链接数,如果不小于则:等待或报raise TooManyConnections异常 # 否则 # 则优先去初始化时创建的链接中获取链接 SteadyDBConnection。 # 然后将SteadyDBConnection对象封装到PooledDedicatedDBConnection中并返回。 # 如果最开始创建的链接没有链接,则去创建一个SteadyDBConnection对象,再封装到PooledDedicatedDBConnection中并返回。 # 一旦关闭链接后,连接就返回到连接池让后续线程继续使用。 conn = POOL.connection() # print(th, '链接被拿走了', conn1._con) # print(th, '池子里目前有', pool._idle_cache, '\r\n') cursor = conn.cursor() cursor.execute('select * from user') result = cursor.fetchall() print(result) conn.close() if __name__ == '__main__': func()
相关文章
- 【Python】软件管理工具--pip
- 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求
- 【python cookbook】【字符串与文本】2.在字符串的开头或结尾处做文本匹配
- 【python基础】Linux环境下非root用户安装Python和第三方包
- 【Python】python对象与json相互转换
- 高斯日记python实现
- Python找工作并不容易,面试了很多企业,总结了些宝贵经验
- Python编程语言学习:python语言中快速查询python自带模块&函数的用法及其属性方法、如何查询某个函数&关键词的用法、输出一个类或者实例化对象的所有属性和方法名之详细攻略
- Python:python语言中与时间有关的库函数简介、安装、使用方法(获取当前时间/计算程序块前后运行时间/模型训练时间或耗费时间)之详细攻略
- Python语言学习之文件格式后缀那些事:python和常见各种文件格式后缀介绍、使用方法之详细攻略
- 已解决2. Set PROTOCOL_BUPFERS_PYTHON_iMPLEMENTATION=python (but this will use pure-Python parsing and w
- 〖Python WEB 自动化测试实战篇⑫〗- 实战 - PageObject框架设计(亦叫做 “页面对象” 模式)
- 〖Python 数据库开发实战 - Python与MySQL交互篇①〗- MySQL Connector 驱动模块的连接语法
- 〖Python 数据库开发实战 - Python与MySQL交互篇⑩〗- 创建新闻管理系统的具体python文件
- 〖Python 数据库开发实战 - Redis篇③〗- Mac系统下通过homebrew安装Redis数据库
- 〖Python 数据库开发实战 - Redis篇④〗- Redis命令行客户端与图形客户端的简单使用
- 〖Python 数据库开发实战 - Redis篇⑤〗- Redis 的常用配置参数
- 粒子群算法求解电力系统环境经济调度+微电网调度(风、光、电动车、柴油机、主网)(Python代码实现)
- 当Python遇到Andriod手机 万物皆可盘
- Python实现GWO智能灰狼优化算法优化卷积神经网络回归模型(卷积神经网络回归算法)项目实战
- Python学习58:StringIO和BytesIO
- Python编程:peewee的pwiz将已有数据库转为Model
- Python使用技巧(五):快速解决安装python-lxml模块库报错问题并简单使用
- Python开发学习之Python用三十行代码,打造一款简单的人工语音对话
- 用Python的MySQLdb库连接数据库
- python基础===利用PyCharm进行Python远程调试(转)
- Python常用内置函数(python 3.x)