python之数据库连接池.md

带着问题做学问

之前只是听说过数据库连接池,但是还没有真正的使用过。项目之初,只是简单的利用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 :用于传递到数据库的准备会话

参考

翟海飞-Python数据库连接池DBUtils
代码参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值