Python如何使用数据库的连接池

Python 数据库连接池

python编程中可以使用pymysql进行数据库连接及增删改查操作,但每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此实际使用中,通常会使用数据库的连接池技术,来访问数据库达到资源复用。

python的数据库连接池包:DBUtils

DBUtils提供两种外部接口:

PersistentDB:提供线程专用的数据库连接,并自动管理连接。

PooledDB:提供线程间可共享的数据库连接,并自动管理连接。 

DBUtils包安装: pip3 install DBUtils或者下载 DBUtils 安装包,解压后,使用python setup.py install 命令进行安装。

未使用连接池的数据库方法:

def getconn(host, user, passwd, db, sql, port=3306,charset='utf8'):conn = pymysql.connect(host=host, user=user, passwd=passwd, port=port, db=db, charset=charset)  #建立连接cur = conn.cursor(cursor=pymysql.cursors.DictCursor)        #建立游标并指定游标类型cur.execute(sql)                              #执行sqlif sql.startswith('select'):                    #判断sql是否是selectres = cur.fetchone()else:conn.commit()                   #insert\delete\update语句执行完毕后需要进行commitres = 88cur.close()                        #关闭游标conn.close()                       #关闭连接return res

用数据库连接池后的方法:

import MySQLdb
from DBUtils.PooledDB import PooledDB
pool = PooledDB(MySQLdb,5,host='localhost',user='root',passwd='pwd',db='myDB',port=3306) #5为连接池里的最少连接数conn = pool.connection()  #以后每次需要数据库连接就是用connection()函数获取连接就好了
cur=conn.cursor()
SQL="select * from table1"
r=cur.execute(SQL)
r=cur.fetchall()
cur.close()
conn.close()

下面利用pymysql 和 DBUtils 建立自己的mysql数据库连接工具包。

class OPMysql(object):__pool = Nonedef __init__(self):# 构造函数,创建数据库连接、游标self.coon = OPMysql.getmysqlconn()self.cur = self.coon.cursor(cursor=pymysql.cursors.DictCursor)# 数据库连接池连接@staticmethoddef getmysqlconn():if OPMysql.__pool is None:__pool = PooledDB(creator=pymysql, mincached=1, maxcached=20, host=mysqlInfo['host'], user=mysqlInfo['user'], passwd=mysqlInfo['passwd'], db=mysqlInfo['db'], port=mysqlInfo['port'], charset=mysqlInfo['charset'])print(__pool)return __pool.connection()# 插入\更新\删除sqldef op_insert(self, sql):print('op_insert', sql)insert_num = self.cur.execute(sql)print('mysql sucess ', insert_num)self.coon.commit()return insert_num# 查询def op_select(self, sql):print('op_select', sql)self.cur.execute(sql)  # 执行sqlselect_res = self.cur.fetchone()  # 返回结果为字典print('op_select', select_res)return select_res#释放资源def dispose(self):self.coon.close()self.cur.close()

配置文件mysqlinfo,包含数据库的连接信息、用户名密码等:

mysqlInfo = {"host": '192.168.1.112',"user": 'root',"passwd": '123456',"db": 'apitest',"port": 3306,"charset": 'utf8'
}

创建test,测试数据库连接

if __name__ == '__main__':#申请资源opm = OPMysql()sql = "select * from demo where name ='a' and pwd='e10adc3949ba59abbe56e057f20f883e' "res = opm.op_select(sql)#释放资源opm.dispose()

PooledDB参数解释:

mincached,最少的空闲连接数,如果空闲连接数小于这个数,pool会创建一个新的连接。

maxcached,空闲连接数,如果空闲连接数大于这个数,pool会关闭空闲连接。

maxconnections,连接数,进程中可创建的线程数。

blocking, 当连接数达到连接数时,再次请求时,如果这个值是True,请求连接的程序会一直等待,直到当前连接数小于连接数;如果这个值为False,会报错。

masxshared,当连接数达到这个数时,新请求的连接会分享已经分配出去的连接。

在uwsgi中,每个http请求都会有一个进程,连接池中配置的连接数都是一个进程为单位的(即上面的连接数,都是在一个进程中创建的线程数),如果业务中,一个http请求中需要的sql连接数不是很多的话(其实大多数都只需要创建一个连接),配置的连接数配置都不需要太大。

连接池对性能的提升:

在程序创建连接的时候,可以从一个空闲的连接中获取,不需要重新初始化连接,提升获取连接的速度。

关闭连接的时候,把连接放回连接池,而不是真正的关闭,所以可以减少频繁的打开和关闭连接。

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

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

相关文章

QT trimmed和simplified

trimmed:去除了字符串开头前和结尾后的空白; simplified:去除了字符串开头前和结尾后的空白,以及中间内部的空白字符也去掉(\t,\n,\v,\f,\r和 ) 代码: QString str " 1 2 3 4 5 …

主机安全技术措施

目录 身份鉴别 进阶 访问控制 进阶 安全审计 进阶 ​编辑 剩余信息保护 入侵防范 进阶 恶意代码防范 资源控制 身份鉴别 进阶 访问控制 进阶 安全审计 进阶 剩余信息保护 入侵防范 进阶 恶意代码防范 资源控制 ~over~

PaddleOCR 的使用,极简介绍

安装 参考github的官网就可以: github链接 简单的说,就是两句话: python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple pip install "paddleocr>2.0.1" # 推荐使用2.0.1版本 Python下的使用…

(2023|CVPR,Corgi,偏移扩散,参数高斯分布,弥合差距)用于文本到图像生成的偏移扩散

Shifted Diffusion for Text-to-image Generation 公众:EDPJ(添加 VX:CV_EDPJ 或直接进 Q 交流群:922230617 获取资料) 目录 0. 摘要 1. 简介 2. 方法 2.1 偏移扩散 3. 实验 3.1 无监督文本到图像生成 3.2 无…

交友系统设计:哪种地理空间邻近算法更快?

小熊学Java:https://javaxiaobear.cn 交友与婚恋是人们最基本的需求之一。随着互联网时代的不断发展,移动社交软件已经成为了人们生活中必不可少的一部分。然而,熟人社交并不能完全满足年轻人的社交与情感需求,于是陌生人交友平台…

嵌入式面试准备

题目都摘于网上 嵌入式系统中经常要用到无限循环,如何用C编写死循环 while(1){}或者for(;😉 内存分区 代码区,全局区(全局变量,静态变量,以及常量),栈区,堆区 const关键…

智能优化算法应用:基于沙猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于沙猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于沙猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.沙猫群算法4.实验参数设定5.算法结果6.参考文…

STM32实战之深入理解I²C通信协议

目录 IC的物理层 IC的协议层 IC特点 IC 总线时序图 软件模拟IC时序分享 例程简介 例程分享 STM32的IC外设 IIC(Inter-Integrated Circuit),也称为IC或TWI(Two-Wire Interface),是一种广泛使用的串行…

在VSCode中使用Git教程

文章目录 提交代码操作分支提交远程库拉取代码参考 介绍一下如何在VSCode中使用Git 首先在VSCode中打开一个项目 打开项目后, 点击下图按钮, 可以引入Git 提交代码 点击 ;相当于git add. 下面两张图, 第一张表示改文件后的号, 只会add本文件. 第二张图表示这段时…

leetcode 6. N 字形变换(medium)(优质解法)

链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 代码: class Solution {public String convert(String s, int numRows) {if(numRows 1) {return s;}int lengths.length();StringBuilder retnew StringBuilder();//获取…

选择排序之C++实现

描述 选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是:每一轮从待排序的数据中选择最小(或最大)的一个元素,然后与待排序数据的第一个元素交换位置。对剩余未排序的数据重复这个过程&a…

C++ 基础

……………………………………………………………………………… 命名空间: 在 C语言环境中,当变量或函数发生冲突的时候,编译器会报错。在一些大工程中不同的板块往往由不同的人员进行编写,合并到一块时可能会出现名字冲突&…