• Python数据库连接池DBUtils


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

    此连接池有两种连接模式:

    • 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接自动关闭。
    •  1 POOL = PersistentDB(
       2     creator=pymysql,  # 使用链接数据库的模块
       3     maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
       4     setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
       5     ping=0,
       6     # 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
       7     closeable=False,
       8     # 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接)
       9     threadlocal=None,  # 本线程独享值得对象,用于保存链接对象,如果链接对象被重置
      10     host='127.0.0.1',
      11     port=3306,
      12     user='root',
      13     password='123',
      14     database='pooldb',
      15     charset='utf8'
      16 )
      17 
      18 def func():
      19     conn = POOL.connection(shareable=False)
      20     cursor = conn.cursor()
      21     cursor.execute('select * from tb1')
      22     result = cursor.fetchall()
      23     cursor.close()
      24     conn.close()
      25 
      26 func()
      View Code
    • 模式二:创建一批连接到连接池,供所有线程共享使用。
      PS:由于pymysql、MySQLdb等threadsafety值为1,所以该模式连接池中的线程会被所有线程共享。
    •  1 POOL = PersistentDB(
       2     creator=pymysql,  # 使用链接数据库的模块
       3     maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
       4     setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
       5     ping=0,
       6     # 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
       7     closeable=False,
       8     # 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接)
       9     threadlocal=None,  # 本线程独享值得对象,用于保存链接对象,如果链接对象被重置
      10     host='127.0.0.1',
      11     port=3306,
      12     user='root',
      13     password='123',
      14     database='pooldb',
      15     charset='utf8'
      16 )
      17 
      18 def func():
      19     conn = POOL.connection(shareable=False)
      20     cursor = conn.cursor()
      21     cursor.execute('select * from tb1')
      22     result = cursor.fetchall()
      23     cursor.close()
      24     conn.close()
      25 
      26 func()
      View Code

     如果没有连接池,使用pymysql来连接数据库时,单线程应用完全没有问题,但如果涉及到多线程应用那么就需要加锁,一旦加锁那么连接势必就会排队等待,当请求比较多时,性能就会降低了。

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import pymysql
     4 import threading
     5 from threading import RLock
     6 
     7 LOCK = RLock()
     8 CONN = pymysql.connect(host='127.0.0.1',
     9                        port=3306,
    10                        user='root',
    11                        password='123',
    12                        database='pooldb',
    13                        charset='utf8')
    14 
    15 
    16 def task(arg):
    17     with LOCK:
    18         cursor = CONN.cursor()
    19         cursor.execute('select * from tb1')
    20         result = cursor.fetchall()
    21         cursor.close()
    22 
    23         print(result)
    24 
    25 
    26 for i in range(10):
    27     t = threading.Thread(target=task, args=(i,))
    28     t.start()
    29 
    30 加锁
    枷锁
     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import pymysql
     4 import threading
     5 CONN = pymysql.connect(host='127.0.0.1',
     6                        port=3306,
     7                        user='root',
     8                        password='123',
     9                        database='pooldb',
    10                        charset='utf8')
    11 
    12 
    13 def task(arg):
    14     cursor = CONN.cursor()
    15     cursor.execute('select * from tb1')
    16     result = cursor.fetchall()
    17     cursor.close()
    18 
    19     print(result)
    20 
    21 
    22 for i in range(10):
    23     t = threading.Thread(target=task, args=(i,))
    24     t.start()
    25 
    26 无锁(报错)
    无锁(报错)

    PS: 查看连接 show status like 'Threads%';

  • 相关阅读:
    shell读取文件不改变文本格式
    lua 的 os.date os.time
    gerrit 操作
    docker 的 镜像生成系列
    Windows 跟 Linux 文件共享:Samba 设置
    viscode 使用 格式的配置
    python pip 升级 或者换源
    centos 的系统管理命令 service systemctl
    Linux 的 netstat 命令
    MVC 、MTV 模式
  • 原文地址:https://www.cnblogs.com/ganxiang/p/10915844.html
Copyright © 2020-2023  润新知