Python3 实现MySQL的数据库连接池及应用 DBUtils库

环境Python3.6下 使用DBUtils库实现MySQL的数据库连接池应用
参考文章:
http://blog.csdn.net/zbc1090549839/article/details/51336458
https://blog.csdn.net/daerzei/article/details/83865325


数据库连接池

先来看 连接池 的概念,引自百度百科:

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

我们为什么要使用 数据库连接池?

我们在进行数据库的连接及诸如查询/插入/更新等操作时,每次连接mysql数据库都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响,从而导致资源泄露等问题。

因此,在实际使用中通常会用数据库的连接池技术,来访问数据库达到资源复用的目的。

数据库连接池的工作流程:

  1. 应用启动时,根据配置的最小连接数,在连接池将创建此数目的数据库连接放到池中。

  2. 应用访问时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。 当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留等待再次使用。

  3. 应用关闭时,关闭池中所有连接,释放所有资源。

Python3 实现MySQL的数据库连接池及应用 DBUtils库_第1张图片


常用连接池的模块 DBUtils

安装 DBUtils:
pip install DBUtils

我们用PyMySQL包作为连接MySQL的驱动,因此也要安装PyMySQL:
pip install PyMySQL


DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装。

DBUtils提供两种外部接口:

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

编写Python代码实现数据库连接池

# 导入所需的 模块与包
import pymysql
from DBUtils.PooledDB import PooledDB
from DBUtils.PersistentDB import PersistentDB


# 配置 数据库连接属性
config = {
    'host': 'your IP',
    'port': 3306,
    'database': 'XXX',
    'user': 'XXX',
    'password': 'XXX',
    'charset': 'utf8'
}


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


if __name__ == '__main__':
    # 以单线程的方式初始化数据库连接池
    db_pool = get_db_pool(False)
    # 从数据库连接池中取出一条连接
    conn = db_pool.connection()
    cursor = conn.cursor()
    # 测试 查询
    cursor.execute('select * from xxx')
    # 取出一条查询结果
    result = cursor.fetchone()
    print(result)
    # 把连接返还给连接池
    conn.close()


你可能感兴趣的:(Python,数据库)