zoukankan      html  css  js  c++  java
  • Python数据库连接池DBUtils

    DBUtils是Python的一个用于实现数据库连接池的模块,有两种使用方式

    为每个线程开辟一个连接

    这种方式一般是不推荐使用的,因为与100个线程难道还开100个连接。线程即使调用了close方法,也不会关闭,这里的close只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接自动关闭。

    from flask import Flask
    app = Flask(__name__)
    from DBUtils.PersistentDB import PersistentDB
    import pymysql
    import time
    
    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='123456',
        database='test',
        charset='utf8'
    )
    
    @app.route('/login')
    def func():
        conn = POOL.connection()
        cursor = conn.cursor()
        cursor.execute('select * from user')
        result = cursor.fetchall()
        cursor.close()
        conn.close() # 不是真的关闭,而是假的关闭。 conn = pymysql.connect()   conn.close()
        time.sleep(300)
    
        conn = POOL.connection()
        cursor = conn.cursor()
        cursor.execute('select * from user')
        result = cursor.fetchall()
        cursor.close()
        conn.close()
    
        return 'login'
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    在这里使用了time.sleep() 的方式,即使在之前调用了 conn.close(), 在windows中通过netstat -ano | findstr 3306可以发现连接一直保持着

    创建固定个数的连接

    from flask import Flask
    app = Flask(__name__)
    from DBUtils.PooledDB import PooledDB
    import pymysql
    import time
    
    POOL = PooledDB(
        creator=pymysql,  # 使用链接数据库的模块
        maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
        mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    
        maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
        maxshared=0,  # 链接池中最多共享的链接数量,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='123456',
        database='test',
        charset='utf8'
    )
    
    @app.route('/login')
    def func():
        conn = POOL.connection()
        cursor = conn.cursor()
        cursor.execute('select * from user')
        result = cursor.fetchall()
        cursor.close()
        conn.close() # 不是真的关闭,而是假的关闭。 conn = pymysql.connect()   conn.close()
        time.sleep(300)
    
        conn = POOL.connection()
        cursor = conn.cursor()
        cursor.execute('select * from user')
        result = cursor.fetchall()
        cursor.close()
        conn.close()
    
        return 'login'
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    这时候conn.close()会把链接放到连接池,下次该线程如果还要用就去连接池去拿。看一下源码流程,因为maxshared永远为0,所以

  • 相关阅读:
    每日总结2021.9.14
    jar包下载mvn
    每日总结EL表达语言 JSTL标签
    每日学习总结之数据中台概述
    Server Tomcat v9.0 Server at localhost failed to start
    Server Tomcat v9.0 Server at localhost failed to start(2)
    链表 java
    MVC 中用JS跳转窗体Window.Location.href
    Oracle 关键字
    MVC 配置路由 反复走控制其中的action (int?)
  • 原文地址:https://www.cnblogs.com/longyunfeigu/p/9468910.html
Copyright © 2011-2022 走看看