python数据库连接池工具类,Python连接池
Python 数据库连接池
Pymysql在python编程中可以用于数据库的连接、添加、删除和查询操作,但是每次连接mysql都要独立请求访问,浪费资源,而且当访问次数达到一定数量时,会对mysql的性能产生很大的影响。因此,在实际使用中,通常采用数据库的连接池技术来访问数据库,实现资源重用。
Python的数据库连接池包:DBUtils
DBUtils提供了两个外部接口:
PersistentDB:提供特定于线程的数据库连接,并自动管理连接。
PooledDB:在线程之间提供可共享的数据库连接,并自动管理连接。
DBUtils的包安装:pip3安装DBUtils或下载DBUtils安装包。解压缩后,使用python setup.py install命令进行安装。
未使用连接池的数据库方法:
defgetconn(主机,用户,密码,数据库,sql,端口=3306,字符集=utf8):
Conn=pymysql.connect (host=host,user=user,passwd=passwd,port=port,db=db,charset=charset) #建立连接
cursor=conn . cursor(cursor=pymysql . cursors . dict cursor)#创建一个游标并指定游标类型。
执行(sql)#执行sql
if sql . starts with( select ): #确定SQL是否是select
res=cur.fetchone()
else:
执行conn.commit()# insert \ delete \ update语句后需要提交。
res=88
Cur.close()#关闭光标
Conn.close()#关闭连接
returnres用数据库连接池后的方法:
g>
importMySQLdb相关推荐:《Python视频教程》fromDBUtils.PooledDBimportPooledDB
pool=PooledDB(MySQLdb,5,host='localhost',user='root',passwd='pwd',db='myDB',port=3306)#5为连接池里的最少连接数
conn=pool.connection()#以后每次需要数据库连接就是用connection()函数获取连接就好了
cur=conn.cursor()
SQL="select*fromtable1"
r=cur.execute(SQL)
r=cur.fetchall()
cur.close()
conn.close()
下面利用pymysql 和 DBUtils 建立自己的mysql数据库连接工具包。
classOPMysql(object):配置文件mysqlinfo,包含数据库的连接信息、用户名密码等:__pool=None
def__init__(self):
#构造函数,创建数据库连接、游标
self.coon=OPMysql.getmysqlconn()
self.cur=self.coon.cursor(cursor=pymysql.cursors.DictCursor)
#数据库连接池连接
@staticmethod
defgetmysqlconn():
ifOPMysql.__poolisNone:
__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
defop_insert(self,sql):
print('op_insert',sql)
insert_num=self.cur.execute(sql)
print('mysqlsucess',insert_num)
self.coon.commit()
returninsert_num
#查询
defop_select(self,sql):
print('op_select',sql)
self.cur.execute(sql)#执行sql
select_res=self.cur.fetchone()#返回结果为字典
print('op_select',select_res)
returnselect_res
#释放资源
defdispose(self):
self.coon.close()
self.cur.close()
mysqlInfo={创建test,测试数据库连接"host":'192.168.1.112',
"user":'root',
"passwd":'123456',
"db":'apitest',
"port":3306,
"charset":'utf8'
}
if__name__=='__main__':PooledDB参数解释:#申请资源
opm=OPMysql()
sql="select*fromdemowherename='a'andpwd='e10adc3949ba59abbe56e057f20f883e'"
res=opm.op_select(sql)
#释放资源
opm.dispose()
mincached,最少的空闲连接数,如果空闲连接数小于这个数,pool会创建一个新的连接。
maxcached,空闲连接数,如果空闲连接数大于这个数,pool会关闭空闲连接。
maxconnections,连接数,进程中可创建的线程数。
blocking, 当连接数达到连接数时,再次请求时,如果这个值是True,请求连接的程序会一直等待,直到当前连接数小于连接数;如果这个值为False,会报错。
masxshared,当连接数达到这个数时,新请求的连接会分享已经分配出去的连接。
在uwsgi中,每个http请求都会有一个进程,连接池中配置的连接数都是一个进程为单位的(即上面的连接数,都是在一个进程中创建的线程数),如果业务中,一个http请求中需要的sql连接数不是很多的话(其实大多数都只需要创建一个连接),配置的连接数配置都不需要太大。
连接池对性能的提升:
在程序创建连接的时候,可以从一个空闲的连接中获取,不需要重新初始化连接,提升获取连接的速度。
关闭连接的时候,把连接放回连接池,而不是真正的关闭,所以可以减少频繁的打开和关闭连接。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。