python数据库链接池基于DBUtils

DBUtils模块的使用的两种方式

DBUtils是Python的一个用于实现数据库链接池的模块mysql

安装sql

pip install DBUtils

1.使用姿式一(不建议此方法)

为每一个线程 (资源占用过多) 建立一个链接,线程即便调用了close方法,也不会关闭,只是把链接从新放到链接池,供本身线程再次使用。当线程终止时,链接自动关闭。数据库

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()
    cursor.execute('select * from tb1')
    result = cursor.fetchall()
    cursor.close()
    conn.close()

func()

2.使用姿式二(好姿式)

建立一批链接到链接池,供全部线程共享使用。(资源重复利用节约资源)session

PS:因为pymysql、MySQLdb等threadsafety值为1,因此该模式链接池中的线程会被全部线程共享。fetch

import time
import pymysql
import threading
from DBUtils.PooledDB import PooledDB, SharedDBConnection
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 func():

    # 一旦关闭连接后,链接就返回到链接池让后续线程继续使用。
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute('select * from tb1')
    result = cursor.fetchall()
    conn.close()


func()
代码转载出自武sir
相关文章
相关标签/搜索