数据库连接池

为了解决共享资源的频繁分配、释放的一些问题,有一个著名的设计模式:资源池。 将该模式应用到数据库连接管理领域,就是建立一个数据库连接池。

数据库连接池

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个,这样可以使得一个数据库连接可以得到高效、安全的复用,避免了数据库频繁建立、关闭的开销,极大的节省了系统资源和时间。

原理

数据库连接池的基本原理是: 在内部对象池中维护一定数量的数据库连接,并对外暴露数据库连接获取和返回方法。一旦数据库连接建立后,不同的数据库访问请求就可以共享复用这些连接。

外部使用者可以通过 getConnection 方法从连接池中获取数据库连接,使用完毕后通过 releaseConnection 方法将连接返回池子,但此时连接并没有关闭,而是由连接池管理器回收,并为下一次使用做好准备。

优势

  1. 资源重用
  2. 更快的系统响应速度: 数据库连接池在初始化时,就已经创建了若干数据库连接置于池中备用,请求访问可以直接使用。
  3. 新的资源分配手段
  4. 统一的连接管理,避免数据库连接泄漏: 在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。

python 数据库连接池

DBUtils

python 中可以用 pymysql、MySQLdb 等进行数据库连接和增删查改操作,但每次请求连接 mysql 时,都是独立的请求访问,比较浪费资源,当请求达到一定数量时,对 mysql 的性能会产生较大影响,因此在 python 中可以使用数据库连接池包 DBUtils 来访问 mysql,从而达到资源复用的目的。

DBUtils 提供两种外部接口:

  • PersistentDB:用于单线程,提供线程专用的数据库连接,并自动管理连接。
  • PooledDB: 用于多线程,提供线程间可共享的数据库连接,并自动管理连接。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import pymysql
from DBUtils.PooledDB import PooledDB
from DBUtils.PersistentDB import PersistentDB

config = {
'host': 'localhost',
'port': 3306,
'database': 'student_course',
'user': 'root',
'password': 'a123456',
'charset': 'utf8'
}

def get_db_pool(is_mult_thread):
if is_mult_thread:
poolDB = PooledDB(
creator=pymysql, # 指定数据库连接驱动
maxconnections=3, # 连接池允许的最大连接数,0 和 None 表示没有限制
mincached=2, # 初始化时,连接池至少创建的空闲连接,0 表示不创建
maxcached=5, # 连接池中空闲的最多连接数,0 和 None 表示没有限制
maxshared=3, # 连接池中最多共享的连接数量,0 和 None 表示全部共享
blocking=True, # 连接池中如果没有可用共享连接后,是否阻塞等待,True 表示等待, False 表示不等待然后报错
setsession=[], # 开始会话前执行的命令列表
ping=0, # ping Mysql 服务器检查服务是否可用
**config
)
else:
poolDB = PersistentDB(
creator=pymysql, # 指定数据库连接驱动
maxusage=1000, # 一个连接最大复用次数,0 或者 None 表示没有限制,默认为 0
**config
)
return poolDB

if __name__ == '__main__':
db_pool = get_db_pool(False) # 以单线程的方式初始化数据库连接池
conn = db_pool.connection() # 从数据库连接池中取出一条连接
cursor = conn.cursor()
cursor.execute('select * from sc') # 执行 sql 语句
result = cursor.fetchall() # 得到所有结果
print(result)
conn.close() # 把连接返还给连接池

参考

数据库连接池的实现及原理
谈谈数据库连接池的原理
Python实现Mysql数据库连接池