DBUtils库是一个用于数据库连接管理的工具,可显著提升数据库访问效率,能减少连接创建开销,提高性能,确保线程安全,尤其适用于Web应用、多线程环境等场景。它主要包括PersistentDB和PooledDB两个模块。PersistentDB是为每个线程保持一个持久数据库连接,而PooledDB则用于维护一个连接池,所有线程共享。本文将详细介绍其用法。
DBUtils库的安装
可以直接使用pip install安装DBUtils库:
pip install DBUtils
PersistentDB模块
PersistentDB模块为每个线程维护一个持久连接,当线程首次请求时创建,之后复用。线程结束后自动关闭,适合线程隔离环境。
连接池配置
以MySQL为例,其配置方法如下:
persistent_pool = PersistentDB(
creator=pymysql,
host='localhost',
user='root',
password='yourpassword',
database='test'
)
不同的数据库需要不同的驱动,比如MySQL使用PyMySQL,PostgreSQL使用psycopg2,请根据实际情况选择驱动,下同。
另外,还有两个参数:
-
maxusage
:单连接最大复用次数,默认值为0,即不限制 -
setsession:
初始化SQL命令(如设置时区),默认值为None
示例
def dosomething():
# 每个线程首次调用时创建连接
conn = persistent_pool.connection()
# CURD操作,省略
conn.close()
需要注意的是,当调用conn.close()时,连接并不会真的关闭,而是等待线程结束,当线程结束时自动关闭。
PooledDB模块
PooledDB是维护一个连接池,所有线程共享,并能确保同一连接在同一时间只被一个线程使用。当线程请求连接时从池中分配连接,使用后归还。
连接池配置
以MySQL为例,其配置方法如下:
from dbutils.pooled_db import PooledDB
import pymysql
pool = PooledDB(
creator=pymysql,
maxconnections=10,
mincached=2,
host='localhost',
user='root',
password='yourpassword',
database='test',
charset='utf8mb4'
)
其中, maxconnections为最大连接数,mincached为初始空闲连接数。
另外,还有三个参数:
-
maxusage
:单连接最大复用次数,默认值为0,即不限制 -
setsession:
初始化SQL命令(如设置时区),默认值为None -
reset:每次归还连接后回滚未提交事务
示例
# 从连接池获取连接
conn = pool.connection()
cursor = conn.cursor()
# 查询
cursor.execute("SELECT * FROM users WHERE id = %s", (1,))
result = cursor.fetchall()
print(result)
# 关闭资源,将连接归还到连接池
cursor.close()
conn.close()
事务管理
PersistentDB和PooledDB都支持事务管理,因为它们提供的是标准的数据库连接对象。
示例
conn = pool.connection()
try:
with conn.cursor() as cursor:
cursor.execute("UPDATE users SET name = 'Tom' WHERE id = 1")
cursor.execute("UPDATE users SET name = 'JACK' WHERE id = 2")
conn.commit()
except Exception as e:
conn.rollback()
print("Error:", e)
finally:
conn.close()
码字不易,原创更不易,如您觉得本文对您有帮助,麻烦动动您富贵的小手,点赞、收藏、关注、订阅!!!