python 数据库连接池_【转】Python 数据库连接池

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

8f13488b56579f2c4752563596028e24.png

python的数据库连接池包:DBUtils

DBUtils提供两种外部接口:

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

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

DBUtils包安装: pip3 install DBUtils

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

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

def getconn(host, user, passwd, db, sql, port=3306,charset='utf8'):

2 conn = pymysql.connect(host=host, user=user, passwd=passwd, port=port, db=db, charset=charset) #建立连接

3 cur = conn.cursor(cursor=pymysql.cursors.DictCursor) #建立游标并指定游标类型

4 cur.execute(sql) #执行sql

5 if sql.startswith('select'): #判断sql是否是select

6 res = cur.fetchone()

7 else:

8 conn.commit() #insert\delete\update语句执行完毕后需要进行commit

9 res = 88

10 cur.close() #关闭游标

11 conn.close() #关闭连接

12 return res

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

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()

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

class OPMysql(object):

__pool = None

def __init__(self):

# 构造函数,创建数据库连接、游标

self.coon = OPMysql.getmysqlconn()

self.cur = self.coon.cursor(cursor=pymysql.cursors.DictCursor)

# 数据库连接池连接

@staticmethod

def 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()

# 插入\更新\删除sql

def 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) # 执行sql

select_res = self.cur.fetchone() # 返回结果为字典

print('op_select', select_res)

return select_res

#释放资源

def dispose(self):

self.coon.close()

self.cur.close()

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

mysqlInfo = {

"host": '192.168.1.112',

"user": 'root',

"passwd": '123456',

"db": 'apitest',

"port": 3306,

"charset": 'utf8'

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

创建test,测试数据库连接

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

if __name__ == '__main__':

#申请资源

opm = OPMysql()

sql = "select * from demo where name ='a' and pwd='e10adc3949ba59abbe56e057f20f883e' "

res = opm.op_select(sql)

#释放资源

opm.dispose()

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

PooledDB参数解释:

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

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

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

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

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

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

连接池对性能的提升:

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

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

后续继续优化~~~~

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

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

相关文章

java 获取oracle表结构_获取Oracle中所有表的列表?

回答(19)2 years ago我们可以从以下查询获取所有表格,包括列详细信息:SELECT * FROM user_tab_columns;2 years ago使用sqlplus更好地查看如果您正在使用 sqlplus ,您可能需要首先设置一些参数以便在您的列被破坏时更好地查看(退出 sqlplus 会…

java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例

之前在项目中会用到在java在后台把数据填入Word文档的模板来提供前台下载,为了自己能随时查看当时的实现方案及方便他人学习我写了这篇博客,访问量已经是我写的博客里第一了。于是乎我在学会用Java在后台利用Apache poi 生成excel文档提供前台下载之后就…

宝塔php漏洞,[安全预警]关于最近宝塔闹得很厉害的PMA漏洞BUG

文章前言在2020年8月23日的下午有个憨憨管理在我群艾特全员 说宝塔爆出漏洞了赶快更新吧!影响机器需同时满足以下所有条件1、软件版本为Linux面板7.4.2 或者Windows面板6.8.02、开放888且未配置http认证,3、安装了phpmyadmin,mysql数据库不受…

求十个学生的平均成绩java,JAVA 声明一个数组,存一个学生的五门成绩。求该学生的总成绩、平均成绩。...

JAVA 声明一个数组,存一个学生的五门成绩。求该学生的总成绩、平均成绩。mip版 关注:116 答案:3 悬赏:30解决时间 2021-01-26 06:39已解决2021-01-25 17:54声明一个数组,存一个学生的五门成绩。求该学生的总成绩、平均成绩。JAVA知识最佳答案2021-01-25 18:12public class S…

php伪静态限制网页播放视频,学习猿地-php伪静态后html不能访问怎么办

php伪静态后html不能访问的解决办法:首先判断文件是否存在;然后设置存在则不rewirte,不存在且符合规则才rewrite;最后修改htaccess文件即可。具体问题:PHP伪静态后不能访问纯html文件.htaccess文件RewriteEngine onRew…

oracle binary_integer pls_integer,oracle中binaryinteger与plsinteger的区别

oracle中binaryinteger与plsinteger的区别 Oracle 中 Binary_Integer 与 Pls_Integer 的区别Binary_Integer 与 Pls_Integer 都是整型类型. Binary_Integer 类型变量值计算是由 Oracle 来执行,不会出现溢出,但是执行速度较慢,因为它是由 Orac…

梁单元分析matlab,[FEM][有限元][编程][Matlab][Code by myself] 2D Timoshenko梁单元

(有空和小伙伴一起写写有限元程序)程序作者 ( Author )JiDong Cui (崔济东)1, XueLong Shen (沈雪龙)21.广州容柏生建筑结构设计事务所;2.华南理工大学建筑设计研究院基本概念 ( Concept )欧拉梁单元基于一定的假设(Kirchhoff假设),在梁的高度远小于其跨…

oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)

oracle的伪列以及伪表oracle系统为了实现完整的关系数据库功能,系统专门提供了一组成为伪列(Pseudocolumn)的数据库列,这些列不是在建立对象时由我们完成的,而是在我们建立时由Oracle完成的。Oracle目前有以下伪列:一、伪列&#…

linux运行搜狗拼音,Linux 搜狗输入法的安装(Ubuntu版)

1、首先从搜狗官网下载搜狗输入法Linux版本的安装包2、按ctrl alt T 打开Linux终端3、安装搜狗输入法: sudo dkpg -i xxx.deb, 如果报错,主要是由于两个原因:a、权限不够,可以通过获取root权限,命令‘su’;…

2023年腾讯云轻量应用服务器测评2核2G4M带宽

腾讯云轻量应用服务器测评2核2G4M带宽88元一年,2核CPU、2G内存、3M带宽,腾讯云轻量应用服务器(Tencent Cloud Lighthouse)是一款开箱即用的云服务器产品,面向轻量应用场景,旨在为中小企业和开发者提供便捷高…

linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析

2016.7.4今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析。1、需求分析首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户端,发送测试文件,测试命令给我们测试程序上&am…

定时器驱动数码管c语言程序,74hc595驱动数码管时间程序

74hc595驱动数码管时间程序这里是电路图:下面是51单片机驱动74hc595芯片的程序:#include //包含51单片机的头文件#include#define uint unsigned int#define uchar unsigned char//sbit sin_595 P1^0;//sbit rclk_595 P…

石油大学c语言考试答案,中石油华东2012春《C语言》在线答案

);! X" l4 d0 m5 T0 A 满分:2 分* }4 x X$ a& t, l% i3. 当对两个字符串进行比较时,应该使用的函数是A. strcat, y, Z- S p t! k! GB. strcmp2 } R% s8 P* Z/ yC. strcpy, i$ q. b5 P8 m j v1 k3 H2 W3 mD. strlen* I B S…

c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...

求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束/*以下是主要的逻辑代码,还有些.c和.h就没发了*/#i…

android view显示隐藏动画效果,Android 根据手势顶部View自动展示与隐藏效果

首先来看一下效果:大体思路如下:总体布局用了一个自定义的ViewGroup,里面包了两个View(top View,bottomView)我在bottomView里放了ViewPager,里面又有Fragment,Fragment里放的是ListView原理:Vi…

android点击地址调用地图,Android 实现点击按钮 调用手机外部地图导航

//弹出Dialog 选择外部地图private void setMap(){final Dialog dianew AlertDialog.Builder(mContext).create();View viewLayoutInflater.from(mContext).inflate(R.layout.dialog_map, null);dia.show();dia.getWindow().setContentView(view);TextView tv_baidu(TextView) …

android webservices 返回多行多列数据,NoahWeb实现表格多行多列

用NoahWeb的表现层指令可以在动态生成的页面中非常容易的实现多行多列的表格。在正式学习以前我们需要先来了解一下怎么用NoahWeb的表现层来做动态内容显示。在NoahWeb设计器中新建或打开一项目以后,在Macromedia Dreamweaver MX 2004中新建了一个“空页面”&#x…

android程序 美食分享,下厨房Android产品分析

下厨房产品宣传图一、产品概况1、产品简介下厨房菜谱是一款简单实用的美食应用,可以帮助用户寻找想吃的美食,搜索精美食谱,使用购买清单选购食材,与朋友分享自己制作的美食。2、主要竞品美食杰、豆果美食、好豆菜谱、香哈菜谱。二…

html实现图片加载动画效果,HTML5+javascript实现图片加载进度动画效果

在网上找资料的时候,看到网上有图片加载进度的效果,手痒就自己也写了一个。图片加载完后,隐藏loading效果。想看加载效果,请ctrelF5强制刷新或者清理缓存。效果预览:0%代码如下:HTML5javascript实现图片加载…

html5开发app的缺点,全解HTML 5在移动Web应用的优劣势

关于HTML5HTML5具有语义学、本地存储、设备访问、连接性、多媒体、平面和三维效果、性能和集成和CSS3八大技术特征。让Web应用进入无插件时代,在功能和性能上逼近桌面应用。促使应用Web化,实现跨平台。HTML5规范草案将于2012年发布候选推荐版&#xff0c…