python3.6使用数据库连接池DBUtils库连接Mysql


1. 前言

在自己的云服务器上建了个Mysql数据库,每次操作连接Mysql的时候插入一条数据关闭连接,插入一条数据连接关闭太浪费资源了,虽然自己的云服务器上,Mysql也只有自己连,但是每次用云服务的时候都觉得像喉咙里卡了个苍蝇.
能不能像Java一样搞个数据库连接池,需要的时候从连接池里拿,用完了再放回去?

2. 环境概述

Python版本:3.6.5
Mysql版本:5.6.39
pip版本:18.1

操作系统:Deepin(Linux)
开发环境:Pycharm 2017.1.1
Git版本:2.17.0
(当然下面的这些相对来说不那么重要)

3. 安装Python依赖库


安装Mysql连接驱动
pip3 install PyMySQL
# 安装数据库连接工具包
pip3 install DBUtils

当然你也可以通过Git源码进行安装,或者Pycharm虚拟环境,再或者AnaConda

4. 一个简单的Demo

if __name__ == '__main__':
    config = {
        'host': '192.168.0.101',
        'port': 3306,
        'database': 'wedo',
        'user': 'wedo',
        'password': 'xxxxxx',
        'charset': 'utf8'
    }
    db_pool = PersistentDB(pymysql, **config)
    # 从数据库连接池是取出一个数据库连接
    conn = db_pool.connection()
    cursor = conn.cursor()
    # 来查下吧
    cursor.execute('select * from books')
    # 取一条查询结果
    result = cursor.fetchone()
    print(result)
    # 关闭连接,其实不是关闭,只是把该连接返还给数据库连接池
    conn.close()

上面是一个最简单的Demo,那些复制的参数什么的都省了,后面再根据需要进行添加
这是运行结果
Python3.6使用数据库连接池连接Mysql_01

这是数据库中完整的数据
Python3.6使用数据库连接池连接Mysql_02
OK用起来就这么简单,说一下这短短的几行代码是什么意思
第一个参数(也就是pymysql)用于指定数据库连接驱动,
config字典自然就是Mysql数据库的连接信息啦
其他的像限制最大,最小连接数量,最大最小缓存数啊什么的这里统统都没有设置,都使用默认的,也就是没有限制

DBUtils库实际上是一个包含两个子模块的Python包:
1.用于连接DB-API 2模块,这个可以连接Mysql,Oracle,啊什么的
2.用于连接PyGreSQL模块,这个是用来访问PostgreSQL数据库的
这里用第一个

DB-API 2模块又主要包含两个模块:

  1. PooledDB这个用于多线程的,如果你的程序频繁地启动和关闭纯种,最好使用这个
  2. PersistentDB这个用于单线程,如果你的程序只是在单个线程上进行频繁的数据库连接,最好使这个

当然这两个模块的接口(也就是参数啦)很相似的,上面的代码你把PersistentDB换成PooledDB完全没有问题,只要别出线程安全的问题就行.

平时写着玩儿的话这个简单的Demo就够了,如果你想更详细了解一下看下面:
PooledDBPersistentDB还有以下参数:

  1. maxconnections: 接池允许的最大连接数,0和None表示没有限制(默认)
  2. mincache: 初始化时,连接池至少创建的空闲连接,0表示不创建
  3. maxcached: 连接池中空闲的最多连接数,0和None表示没有限制
  4. maxshared:连接池中最多共享的连接数量,0和None表示全部共享(其实没什么用)
  5. blocking: 连接池中如果没有可用共享连接后,是否阻塞等待,True表示等等,False表示不等待然后报错
  6. setsession: 开始会话前执行的命令列表
  7. ping: ping Mysql服务器检查服务是否可用

5 一个详细的配置

"""
数据库连接工具类
# """
import pymysql
from DBUtils.PooledDB import PooledDB, SharedDBConnection
from DBUtils.PersistentDB import PersistentDB, PersistentDBError, NotSupportedError
config = {
    'host': '192.168.0.101',
    'port': 3306,
    'database': 'wedo',
    'user': 'wedo',
    'password': 'xxxxxxxx',
    'charset': 'utf8'
}

def get_db_pool(is_mult_thread):
    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 books')
    # 随便取一条查询结果
    result = cursor.fetchone()
    print(result)
    # 把连接返还给连接池
    conn.close()
  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值