带着问题做学问
之前只是听说过数据库连接池,但是还没有真正的使用过。项目之初,只是简单的利用pymysql做数据库的一些操作,随着项目的进行发现程序进程还在,但数据库的连接已被关闭(超过一定时间后,数据库连接会自动关闭),带着这个问题,通过咨询和查找资料,于是有了本篇。
数据库连接池的作用
数据库连接池能在系统初始化的时候建立一定数量(具体数量由配置文件决定)的数据库连接,并维护这些连接在内存中,当用户访问时,可以快速的提供一个空闲连接(连接在初始化时已建好,省时)用户使用完毕,连接重新回归连接池。可通过配置文件修改连接池的初始连接数、最大空闲时间、使用次数等。
DBUtils
DBUtils是一套Python数据库连接池包,可以使你很方便的使用数据库连接池而不必自己搭建。
下载地址:DBUtils,
也可以使用pip方法安装。
pip install DBUtils
创建一个数据库连接池
具体代码如下:
import pymysql
from DBUtils.PooledDB import PooledDB
import json
import os
class DBPool(object):
__pool = None
def __init__(self): # 构造函数,创建数据库连接
self.conn = DBPool.getmysqlconn(self)
self.cur = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
def get_config(self, file_name="db_config"):
path = os.getcwd() # 获取当前工作目录
with open(path +'\DB_pool\\' + file_name, "r", encoding='utf8') as f:
config = json.load(f)
return config
@staticmethod
def getmysqlconn(self):
conf = self.get_config()
if DBPool.__pool is None:
__pool = PooledDB(creator=pymysql,
mincached=conf['db_pool']['mincached'],
maxcached=conf['db_pool']['maxcached'],
maxshared=conf['db_pool']['maxshared'],
maxconnections=conf['db_pool']['maxconnections'],
blocking=conf['db_pool']['blocking'],
maxusage=conf['db_pool']['maxusage'],
setsession=None,
host=conf['db']['host'],
port=conf['db']['port'],
user=conf['db']['user'],
passwd=conf['db']['password'],
db = conf['db']['database'],
charset=conf['db']['charset']
)
return __pool.connection()
def get_data(self, sql):
"""
查找
:param sql:
:return:
"""
self.cur.execute(sql)
result = self.cur.fetchall()
return result
def modify(self, sql, args):
try:
num = self.cur.executemany(sql, args)
self.conn.commit()
return num
except Exception as e:
self.conn.rollback()
def dispose(self): # 关闭连接
self.cur.close()
self.conn.close()
if __name__=='__main__':
ad = DBPool()
sql = ''
# sql_ = ""
sql_args = []
result = ad.get_data(sql)
# num = ad.modify(sql_, [sql_args])
print(result)
配置文件如下:
{
"db":{
"host":"localhost",
"port":3306,
"user":"root",
"password":"root",
"database":"test",
"charset":"utf8"
},
"db_pool":{
"mincached":2,
"maxcached":10,
"maxshared":10,
"maxconnections":10,
"blocking":1,
"maxusage":0
}
}
具体参数的含义:
mincached :启动时开启的空连接数量
maxcached :连接池最大可用连接数量
maxshared :连接池最大可共享连接数量
maxconnections :最大允许连接数量
blocking :达到最大数量时是否阻塞
maxusage :单个连接最大复用次数
setsession :用于传递到数据库的准备会话