使用连接池意义
减少频繁和数据库建立连接从而耗费资源
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)