flask---使用连接池DBUtils

本文介绍了Python的DBUtils模块,用于实现数据库连接池。内容包括DBUtils的安装,基础使用方法,多线程测试以及基于函数的SQL助手的实现。示例代码展示了如何配置和操作连接池,以及在Flask应用中的使用。
摘要由CSDN通过智能技术生成

0. DBUtils介绍

  • 是Python的一个用于实现数据库连接池的模块。

1. 安装

1.1 安装DBUtils

  • 在python3x中使用最新版的DBUtils,会报错,找不到模块,换成1.2版的就行了
pip3 install DBUtils==1.2

1.2 安装pymsql

pip3 install pymysql

2. 基础使用

POOL = PersistentDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
    ping=0,
    # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
    closeable=False,
    # 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接)
    threadlocal=None,  # 本线程独享值得对象,用于保存链接对象,如果链接对象被重置
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='pooldb',
    charset='utf8'
)

def func():
    # 链接连接池
    conn = POOL.connection(shareable=False)
    # 创建游标
    cursor = conn.cursor()
    # sql语句
    cursor.execute('select * from tb1')
    # 查询所有
    result = cursor.fetchall()
    # 游标关闭
    cursor.close()
    # 将连接放回连接池
    conn.close()

func()

3. 多线程测试

import pymysql
from DBUtils.PooledDB import PooledDB

POOL = PooledDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
    maxshared=3,
    # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
    ping=0,
    # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='pooldb',
    charset='utf8'
)


def task(num):
    conn = POOL.connection()
    # 创建游标
    cursor = conn.cursor()
    # sql语句
    cursor.execute('select * from tb1')
    # 执行
    result = cursor.fetchall()
    # 关闭游标
    cursor.close()
    # 将连接放回连接池
    conn.close()
    print(num, '--->', result)


from threading import Thread

for i in range(57):
    t = Thread(target=task, args=(i,))
    t.start()

4. 基于函数的sqlhelper

4.1 pool

import pymysql
from DBUtils.PooledDB import PooledDB

# pip3 install DBUtils==1.2

POOL = PooledDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
    maxshared=3,
    # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
    ping=0,
    # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
    host='106.14.42.253',
    port=8765,
    user='root',
    password='foobared',
    database='ly_mysql',
    charset='utf8'
)


def fetchall(sql, *args):
    """执行多条"""
    conn = POOL.connection()
    # 创建游标
    cursor = conn.cursor()
    # sql语句
    cursor.execute(sql, args)
    # 执行
    result = cursor.fetchone()
    # 关闭游标
    cursor.close()
    # 将连接放回连接池
    conn.close()
    return result


def fetchone(sql, *args):
    """执行多条"""
    conn = POOL.connection()
    # 创建游标
    cursor = conn.cursor()
    # sql语句
    cursor.execute(sql, args)
    # 执行
    result = cursor.fetchone()
    # 关闭游标
    cursor.close()
    # 将连接放回连接池
    conn.close()
    return result

4.2 flask

from flask import Flask

import p2

app = Flask(__name__)


@app.route('/index')
def index():
    res = p2.fetchall('select * from ly_user ')
    print(res)
    return 'ok'


if __name__ == '__main__':
    app.run()

5. 基于函数的sqlhelper

5.1 pool

import pymysql
from DBUtils.PooledDB import PooledDB


class SqlHelper:
    def __init__(self):
        self.pool = PooledDB(
            creator=pymysql,  # 使用链接数据库的模块
            maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
            mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
            maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
            maxshared=3,
            # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
            blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
            maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
            setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
            ping=0,
            # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
            host='106.14.42.253',
            port=8765,
            user='root',
            password='foobared',
            database='ly_mysql',
            charset='utf8'
        )

    def open(self):
        conn = self.pool.connection()
        # 创建游标
        cursor = conn.cursor()
        return conn, cursor

    def close(self, conn, cursor):
        # 关闭游标
        cursor.close()
        # 将连接放回连接池
        conn.close()

    def fetchall(self, sql, *args):
        """执行一条"""
        conn, cursor = self.open()
        # sql语句
        cursor.execute(sql, args)
        # 执行
        result = cursor.fetchall()
        return result

    def fetchone(self, sql, *args):
        """执行多条"""
        conn, cursor = self.open()
        # sql语句
        cursor.execute(sql, args)
        # 执行
        result = cursor.fetchone()
        # 关闭游标
        cursor.close()
        # 将连接放回连接池
        conn.close()
        return result


db = SqlHelper()

5.2 flask

from flask import Flask

import p2
import p3

app = Flask(__name__)


@app.route('/index')
def index():
    res = p3.db.fetchall('select * from ly_user ')
    print(res)
    return 'ok'


if __name__ == '__main__':
    app.run()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑台风走

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值