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

Python 数据库连接池
在python编程中,pymysql可用于数据库连接、添加、删除、修改和检查。然而,每次连接mysql请求时,它都会独立请求访问,这是浪费资源。此外,当访问数量达到一定数量时,将对mysql的性能产生很大影响。因此,在实际使用中,通常使用数据库连接池技术访问数据库以实现资源重用。
Python数据库连接池包:DBUtils
DBUtils提供两个外部接口:
PersistentDB:提供专用的线程数据库连接,并自动管理连接。
PooledDB:提供线程间可共享的数据库连接,并自动管理连接。
安装DBUtils包: pip3 install 或下载DBUtils或下载 DBUtils 安装包,解压后,使用python setup.py install 安装命令。
未使用连接池的数据库方法:
defgetconn(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)#执行sql
ifsql.startswith('select'):#判断sql是否是selectt
res=cur.fetchone()
else:
conn.commit()#insert\delete执行update语句后,需要committe
res=88
cur.close()#关闭游标
conn.close()#关闭连接
returnres用数据库连接池后的方法:
importMySQLdb 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()
相关推荐:Python视频教程
使用pymysqlll 和 DBUtils 建立自己的mysql数据库连接工具包。
classOPMysql(object):
__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()
#插入\更新\删除sqll
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配置文件,包括数据库连接信息、用户名密码等。
mysqlInfo={
"host":'192.168.1.112',
"user":'root',
"passwd":'123456',
"db":'apitest',
"port":3306,
"charset":'utf8'
}创建test,测试数据库连接
if__name__='__main__': #申请资源 opm=OPMysql() sql="select*fromdemowherename='a'andpwd='e10adc3949ba59abe56e057f20f83;" res=opm.op_select(sql) #释放资源 opm.dispose()
PooledB参数解释:
mincached,如果空闲连接数小于这个数字,pool将创建一个新的连接。
maxcached,如果空闲连接数大于此数,pool将关闭空闲连接。
maxconnections,在这个过程中可以创建连接数和线程数。
blocking, 当连接数达到连接数并再次要求时,如果该值为True,请求连接程序将始终等待,直到当前连接数小于连接数;如果该值为False,则报告错误。
masxshared,当连接数达到此数时,新请求的连接将共享已分配的连接。
在uwsgi中,每个http请求都有一个过程。连接池中配置的连接数为单位(即上述连接数为一个过程中创建的线程数)。如果业务中http请求中需要的sql连接数不多(事实上,大多数只需要创建一个连接),则配置的连接数配置不需要太大。
提高连接池的性能:
在创建程序连接时,可以从无需重新初始化连接的空闲连接中获得,以提高获取连接的速度。
关闭连接时,将连接放回连接池,而不是真正关闭,以减少频繁打开和关闭连接。
