使用连接池意义

减少频繁和数据库建立连接从而耗费资源

pip install DBUtils 安装

第一步:创建数据库配置文件db_config.py

import MySQLdb

# 数据库信息,可以使用字典的格式来维护多个数据库连接信息
TEST_DB_CONFIG = {
    "host": "192.168.xxx",
    "port": xxx,
    "user": "xxx",
    "password": "pwd110396.L",
    "db": "xxx",
    "charset": "utf8"
}
GADM_DB_CONFIG = {
    "host": "192.168.xxx",
    "port": 3307,
    "user": "xxx",
    "password": "xxx",
    "db": "xxx",
    "charset": "utf8"
}
# creator:数据库驱动模块,如常见的pymysql,pymssql,cx_Oracle模块。无默认值
# mincached:初始化连接池时创建的连接数。默认为0,即初始化时不创建连接。(建议默认0,假如非0的话,在某些数据库不可用时,整个项目会启动不了)
# maxcached:池中空闲连接的最大数量。默认为0,即无最大数量限制。(建议默认)
# maxshared:池中共享连接的最大数量。默认为0,即每个连接都是专用的,不可共享(不常用,建议默认)
# maxconnections:被允许的最大连接数。默认为0,无最大数量限制。(视情况而定)
# blocking:连接数达到最大时,新连接是否可阻塞。默认False,即达到最大连接数时,再取新连接将会报错。(建议True,达到最大连接数时,新连接阻塞,等待连接数减少再连接)
# maxusage:连接的最大使用次数。默认0,即无使用次数限制。(建议默认)
# setsession:可选的SQL命令列表,可用于准备会话。(例如设置时区)
# reset:当连接返回到池中时,重置连接的方式。默认True,总是执行回滚。(不太清楚,建议默认)
# ping:确定何时使用ping()检查连接。默认1,即当连接被取走,做一次ping操作。0是从不ping,1是默认,2是当该连接创建游标时ping,4是执行sql语句时ping,7是总是ping
# 数据库连接编码
DB_CHARSET = "utf8"

# 开始时的闲置连接数量
DB_MINCACHED = 0
DB_MAXCACHED = 0

DB_MAX_SHARED = 5
# 最大连接数
DB_MAX_CONNECTIONS = 100

DB_BLOCKING = True

DB_CREATOR = pymsql # 根据使用的工具来决定,我使用的是pymysql,所以此处填pymsql

第二步:数据库连接池初始化类DbConnector

from dbutils.pooled_db import PooledDB
# 导入数据库配置信息
from db_config import *


"""
创建数据库连接池
"""
class MysqlTools:
    # 在此处使用可变参数来接受多个关键字参数,在初始化此类时直接传入字典即可,非常方便
    def __init__(self, **kwargs):
        self.pool = PooledDB(
            creator=pymysql,  # 使用的链接数据库模块
            maxconnections=DB_MAX_CONNECTIONS,  # 连接池允许的最大连接数
            mincached=DB_MINCACHED,  # 初始化时,连接池中至少创建的空闲链接,0表示不创建
            maxcached=DB_MAXCACHED,  # 连接池中允许最多的空闲连接数
            maxshared=DB_MAX_SHARED,  # 连接池中最多允许共享的连接数
            blocking=True,  # 连接池中如果没有可用的连接,当前的连接请求是否阻塞
            maxusage=None,  # 一个连接最多被重复使用的次数,None表示不限制
            setsession=[],
            ping=0,
            host=kwargs["host"],
            port=kwargs["port"],
            user=kwargs["user"],
            password=kwargs["password"],
            database=kwargs["db"],
            charset=kwargs["charset"]
        )

    def open(self):
        conn = self.pool.connection()
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        return conn, cursor


    def close(self, conn, cursor):
        cursor.close()
        conn.close()

    def get_list(self, sql, args=None):
        try:
            conn, cursor = self.open()
            cursor.execute(sql, args)
            result = cursor.fetchall()
            self.close(conn, cursor)
            return result
        except Exception as e:
            return False

    # 查询单条记录
    def get_one(self, sql, args=None):
        try:
            conn, cursor = self.open()
            cursor.execute(sql, args)
            result = cursor.fetchone()
            self.close(conn, cursor)
            return result
        except Exception as e:
            return False

    # 插入单条数据
    def insert(self, sql, args=None):
        try:
            conn, cursor = self.open()
            cursor.execute(sql, args)
            conn.commit()
            self.close(conn, cursor)
            # logger.info(f"insert_one 执行成功")
            return True
        except Exception as e:
            # logger.error(f"执行insert 异常 Error:{e} SQL:{sql}")
            # print(e)


mysql_1 = MysqlTools(**GADM_DB_CONFIG)
test_mysql = MysqlTools(**TEST_DB_CONFIG)
posted on 2021-06-26 16:35  x-dai  阅读(466)  评论(0编辑  收藏  举报