Python数据库链接池DBUtils

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

此链接池有两种链接模式:sql

    DBUtils提供两种外部接口:
    PersistentDB :提供线程专用的数据库链接,并自动管理链接。
    PooledDB :提供线程间可共享的数据库链接,并自动管理链接。数据库

PersistentDB 模式

为每一个线程建立一个链接,线程即便调用了close方法,也不会关闭,只是把连接从新放到连接池,供本身线程再次使用,当线程终止时,连接自动关闭session

from DBUtils.PersistentDB import PersistentDB
import pymysql
POOL = PersistentDB(
    creator=pymysql,  # 使用连接数据库的模块
    maxusage=None,  # 一个连接最多被重复使用的次数,None表示无限制
    setsession=[],  # 开始会话前执行的命令列表。
    ping=0,
    # ping MySQL服务端,检查是否服务可用。
    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='123456',
    database='test',
    charset='utf8'
)

def func():
    conn = POOL.connection(shareable=False)
    cursor = conn.cursor()
    cursor.execute('select * from user')
    result = cursor.fetchall()
    print(result)
    cursor.close()
    conn.close()
if __name__ == '__main__':

    func()

PooledDB 模式

 建立一批链接到链接池,供全部线程共享使用。fetch

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=[],  # 开始会话前执行的命令列表。
    ping=0,
    # ping MySQL服务端,检查是否服务可用。
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123456',
    database='test',
    charset='utf8'
)


def func():
    # 检测当前正在运行链接数的是否小于最大连接数,若是不小于则:等待或报raise TooManyConnections异常
    # 不然
    # 则优先去初始化时建立的连接中获取连接 SteadyDBConnection。
    # 而后将SteadyDBConnection对象封装到PooledDedicatedDBConnection中并返回。
    # 若是最开始建立的连接没有连接,则去建立一个SteadyDBConnection对象,再封装到PooledDedicatedDBConnection中并返回。
    # 一旦关闭连接后,链接就返回到链接池让后续线程继续使用。
    conn = POOL.connection()

    # print(th, '连接被拿走了', conn1._con)
    # print(th, '池子里目前有', pool._idle_cache, '\r\n')

    cursor = conn.cursor()
    cursor.execute('select * from user')
    result = cursor.fetchall()
    print(result)
    conn.close()

if __name__ == '__main__':

    func()
相关文章
相关标签/搜索