Python 数据库连接池

当在进行web开发的时候,经常会对数据进行增删改查的操作, 但我们每次使用pymysql连接数据库的时候, 都是一个独立的访问资源, 比较浪费资源, 当访问量过大的时候, 对数据库性能也是一个巨大的挑战, 所以在实际工作中,我们经常会使用到连接池技术, 以达到资源复用(本文以mysql数据库为例)

PooledDB

python中有一个数据库连接池的第三方包,创建连接池如下:

from DBUtils.PooledDB import PooledDB
import pymysql
pool = PooledDB(
    creator=pymysql,  
    maxconnections=5,  
    mincached=2,  
    maxcached=5,  
    maxshared=3,
    blocking=True,  
    maxusage=None,  
    setsession=[],
    ping=0,
    port=3306,
    host='127.0.0.1',
    user='root',
    password="password",
    db="dbpool",
    charset='utf8'
)

参数详解:

  1. creator : 使用链接数据库的模块
  2. maxconnections: pool连接池允许的最大连接数
  3. mincached : 初始化连接池中创建的最少的空闲数据库连接, 0表示不创建连接
  4. maxcached : 连接池中最多的空闲连接, 0和None表示不限制
  5. maxshared : 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块 的threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享
  6. blocking : 当连接数达到最大的连接数时,在请求连接的时候,如果这个值是True,请求连接的程序会一直等待,直 到当前连接数小于最大连接数,如果这个值是False,会报错
  7. maxusage : 一个链接最多被重复使用的次数,None表示无限制
  8. setsession : 开始会话前执行的命令列表
  9. ping : ping MySQL服务端,检查是否服务可用

使用连接池:

from dbpool import pool
import pymysql
class DataBaseSession(object):
    def __init__(self):
        self.__conn = pool.connection()

    @property
    def connection(self):
        return self.__conn

    def begin(self):
        self.__conn.begin()

    def rollback(self):
        self.__conn.rollback()

    def commit(self):
        self.__conn.commit()

    def query_tuple_data(self, sql: str, args=None):
        cursor = self.__conn.cursor()
        cursor.execute(sql, args)
        res = cursor.fetchall()
        # 关闭游标对象
        cursor.close()
        return res

    def query_dict_fetchall(self, sql: str, args=None):
        cursor = self.__conn.cursor(pymysql.cursors.DictCursor)
        cursor.execute(sql)
        res = cursor.fetchall()
        # 关闭游标对象
        cursor.close()
        return res

    def execute(self, sql: str, args=None):
        cursor = self.__conn.cursor()
        lines = cursor.execute(sql, args)
        return lines

    def __del__(self):
        self.__conn.close()


sql = "select * from users where name=%s and age=%s"
session = DataBaseSession()
res = session.query_dict_fetchall(sql, ("mjj",9))
print(res) # 打印结果

以上是我个人的看法, 不足之处请各位大佬指正

你可能感兴趣的:(笔记,使用心得)