Python 数据库连接池
在python编程中,可以使用pymysql进行数据库连接和增删改查操作,但是每次连接mysql请求时,都是独立请求访问的,这样很浪费资源,而且当访问次数达到一定数量,mysql的性能会比较差。大的影响。因此,在实际使用中,通常使用数据库连接池技术来访问数据库,以实现资源复用。
python的数据库连接池包:DBUtils
DBUtils提供两种外部接口:
PersistentDB:提供线程专用的数据库连接,并自动管理连接。
PooledDB:提供线程间可共享的数据库连接并自动管理连接。
DBUtils包安装:pip3安装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) #执行sql
if sql.startswith('select'): #判断sql是否是select
res = cur.fetchone()
else:
conn.commit() #insert\delete\update语句执行完毕后需要进行commit
res = 88
cur.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 = 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()
配置文件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,最小空闲连接数,如果空闲连接数小于这个数,池会创建一个新的连接。
maxcached,空闲连接数,如果空闲连接数大于这个数,池将关闭空闲连接。
maxconnections,连接数,进程中可创建的线程数。
阻塞,当连接数达到连接数时,再次请求时,如果该值为True,则请求连接的程序会一直等待,直到当前连接数小于连接数;如果该值为 False,则会报错。
masxshared,当连接数达到这个数时,新请求的连接将共享已分配的连接。
在uwsgi中,每个http请求都会有一个进程,连接池中配置的连接数是以一个进程为单位的(即上面的连接数就是一个进程中创建的线程数)。如果一个http请求需要的sql连接数不多(其实大部分只需要创建一个连接),配置的连接数的配置不需要太大。
连接池对性能的提升:
当程序创建连接时,无需重新初始化连接即可从空闲连接中获取,提高了获取连接的速度。
当连接关闭时,将连接放回连接池,并没有真正关闭,这样可以减少连接的频繁打开和关闭。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 从 Python 列表中删除元素的 3 种方法11/09
- ♥ 如何解决python numpy导入错误11/03
- ♥ python如何在没有回车换行的情况下输出09/15
- ♥ Python如何生成随机图形验证码11/03
- ♥ python如何制作接口08/31
- ♥ python中列表和元组的区别09/26
内容反馈