首页 > 数据库 >pymysql通过DBUtils实现连接池技术

pymysql通过DBUtils实现连接池技术

时间:2023-02-22 01:33:38浏览次数:42  
标签:数据库 pymysql 线程 MYSQL DBUtils 连接 连接池

DBUtils 是一套 Python 数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装。

一、安装

pip install DBUtils

二、导入模块

# 针对不同版本,可能导入方式存在差别
try:
    from dbutils.pooled_db import PooledDB
    from dbutils.persistent_db import PersistentDB
except:
    from DBUtils.PooledDB import PooledDB
    from DBUtils.PersistentDB import PersistentDB

三、使用

  • DBUtils提供两种外部接口:

    • PersistentDB:

      • 每当一个线程首次打开数据库连接时,都会创建一个新的数据库连接,并且该连接始终服务于该特定线程,直到该线程销毁,连接才会关闭
      • 通过重用数据库连接来提高数据库的访问性能,同时确保了线程间不共享数据库连接(当线程数一定的情况下,推荐使用)
      • 注意:避免短时间内创建多个线程(创建多个线程时,可使用延时操作)
      • 实例化时常用参数设置:
        import pymysql
        from dbutils.persistent_db import PersistentDB
        
        pool = PersistentDB(pymysql, host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, db=MYSQL_DATABASE,
                            password=MYSQL_PASSWORD, charset='utf8mb4')

        第一个参数指定的是连接数据库的模块pymysql,其它使用默认参数(maxusage=None表示每个连接的使用次数不受限,ping=1表示每次获取连接时,检查连接是否可用...),后面都是使用pymysql中的参数

    • PooledDB

      • 能够提供线程间可共享的数据库连接,但是需要通过maxshared参数指定最多可共享连接数
      • 对于应用中需要频繁地创建和销毁线程时,推荐使用
      • 实例化常用参数设置:
        import pymysql
        from dbutils.pooled_db import PooledDB
        
        # 以5个线程并发为例
        pool = PooledDB(pymysql, mincached=5, maxcached=5, maxconnections=5, blocking=True, host=MYSQL_HOST, port=MYSQL_PORT,
                        user=MYSQL_USER, db=MYSQL_DATABASE, password=MYSQL_PASSWORD, charset='utf8mb4')

        mincached指定初始化时连接池中的连接数,maxcached指定最大空闲连接数,maxconnections指定连接池允许的最大连接数,blocking表示池中没有可用连接时,是否阻塞

  • 使用连接池操作数据库

    con = pool.connection() # 从池中获取数据库连接
    cursor = con.cursor() # 创建游标
    sql = '比如插入相关的sql语句'
    try:
        cursor.execute(sql, [])
        con.commit()
    except:
        con.rollback()
    finally:
        cursor.close() # 关闭游标
        con.close() # 将数据库连接放回连接池(注意不是关闭该连接)

    连接池pool最后不需要我们手动调用close()方法关闭,内部帮我们自动维护(__del__()方法中已实现self.close())

标签:数据库,pymysql,线程,MYSQL,DBUtils,连接,连接池
From: https://www.cnblogs.com/eliwang/p/17136077.html

相关文章