mysql连接池

2023-05-16

 

文章出处   https://www.cnblogs.com/wupeiqi/articles/8184686.html

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

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

  • 模式一:为每个线程创建一个连接,线程即使调用了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()  
    View Code
  • 模式二:创建一批连接到连接池,供所有线程共享使用。
    PS:由于pymysql、MySQLdb等threadsafety值为1,所以该模式连接池中的线程会被所有线程共享。
    
    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():
        # 检测当前正在运行连接数的是否小于最大链接数,如果不小于则:等待或报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 tb1')
        result = cursor.fetchall()
        conn.close()
    
    
    func()  
    View Code

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


#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
import threading
from threading import RLock

LOCK = RLock()
CONN = pymysql.connect(host='127.0.0.1',
                       port=3306,
                       user='root',
                       password='123',
                       database='pooldb',
                       charset='utf8')


def task(arg):
    with LOCK:
        cursor = CONN.cursor()
        cursor.execute('select * from tb1')
        result = cursor.fetchall()
        cursor.close()

        print(result)


for i in range(10):
    t = threading.Thread(target=task, args=(i,))
    t.start()  
加锁

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
import threading
CONN = pymysql.connect(host='127.0.0.1',
                       port=3306,
                       user='root',
                       password='123',
                       database='pooldb',
                       charset='utf8')


def task(arg):
    cursor = CONN.cursor()
    cursor.execute('select * from tb1')
    result = cursor.fetchall()
    cursor.close()

    print(result)


for i in range(10):
    t = threading.Thread(target=task, args=(i,))
    t.start()  
无锁(报错)

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

转载于:https://www.cnblogs.com/AbnerLc/p/11630928.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql连接池 的相关文章

随机推荐

  • linux slf4j找不到,SLF4J错误消息

    在本章中 xff0c 我们将讨论在使用SLF4J时获得的各种错误消息或警告以及这些消息的原因 含义 无法加载类 org slf4j impl StaticLoggerBinder 这是在类路径中没有提供SLF4J绑定时引起的警告 以下是完整
  • C#使用RabbitMQ

    1 说明 在企业应用系统领域 xff0c 会面对不同系统之间的通信 集成与整合 xff0c 尤其当面临异构系统时 xff0c 这种分布式的调用与通信变得越发重要 其次 xff0c 系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的
  • 安装rpm的mysql_linux下安装rpm格式的mysql

    1 下载安装包 官网下载 rpm格式安装包 xff0c 需要下面两个文件 xff1a MySQL server 5 0 26 0 i386 rpm MySQL client 5 0 26 0 i386 rpm 注 xff1a 官网下载时 x
  • 我的世界服务器怎么修改合成表,《我的世界》1.8原版自定义合成表教程 怎么自定义合成表...

    我的世界 1 8原版自定义合成方法 xff0c 很多玩家还不了解 xff0c 今天给大家带来玩家 真名 分享的 我的世界 1 8原版自定义合成表教程 xff0c 一起来看看吧 版本要求1 8 优点 xff1a 自定义 合成表数量可以很大 合
  • 题解 化学反应

    化学反应 Description 有 N 种不同的物质 xff0c 每种物质有两个属性 能量 和 活度 N 种中的任意两种物质都可以发生反应 xff1b 反应放热为两种物质的 能量 之差加一再乘上 活度 的较大值 换句话说 xff0c 设第
  • JAVA字符串中的转义字符

    一 在java字符串中如果出现斜杠 xff0c 1 当成转义字符 34 34 时 xff0c 后面必须接八进制数字进行ASCII转义输出成其它字符 xff0c 2 当成字符串字面值斜杠直接输出时 xff0c 必须用双斜杠 34 34 转义为
  • # ES6基础

    ES6基础 let和const 在以前的js中有一个问题 xff0c 就是只存在函数作用域而不存在局部作用域 let xff0c const的出现改变了这个问题 const就是定义常量 this指向 说默认this指向调用它的对象倒不如说函
  • SpringBoot实现定时器定时处理任务

    最近在项目中遇到了一个问题 对于新建的活动 活动设置了开始时间和结束时间 也就是数据库中的一个状态码的改变而已 但是 这里就有问题了 如何去实现到时间更改活动状态呢 1 刚开始的时候 我想了下定时任务 但是怎么也想不出配置的时间问题 对于活
  • 在雪豹10.6.2(Mac OS X)上安装Oracle10g

    1 Install preparation 基本环境 xff1a Snow Leopard10 6 2 xff0c Oracle10 2 0 4 打开Mac的终端 xff0c 执行 xff1a sudo i 创建oinstall组和orac
  • abaqus2016安装过程中出现error:unable to add abaqus command directory to PATH variable

    请问abaqus2016安装过程中出现error unable to add abaqus command directory to PATH variable是什么原因 xff0c 怎么解决啊 xff0c 总是安装失败 这个问题我解决了
  • MySQL中的 DATE_FORMAT 与 SQL 中的 DATEPART()函数使用介绍

    本小白最近学习MySQL xff0c 因为之前是已经有学过微软大佬的SQL Server所以自认为理解的还是稍快的 滑鸡 xff0c 好了说正事 今天在写一个查询语句时 xff0c 需要用到 一个日期函数 xff1a DATEPART 因为
  • ps常见颜色以及其色值

    1 白色 FFFFFF 2 红色 FF0000 3 绿色 00FF00 4 蓝色 0000FF 5 牡丹红 FF00FF 6 青色 00FFFF 7 黄色 FFFF00 8 黑色 000000 9 海蓝 70DB93 10 巧克力色 5C3
  • Python 文件操作Error: binary mode doesn't take an encoding argument

    Python 报错 xff1a ValueError binary mode doesn 39 t take an encoding argument 在运行文件操作相关功能时报错 xff1a ValueError binary mode
  • Mac OS X 完全卸载MySQL

    执行下列命令 sudo rm usr local mysqlsudo rm rf usr local mysql sudo rm rf Library StartupItems MySQLCOMsudo rm rf Library Pref
  • 揭秘微信红包:架构、抢红包算法、高并发和降级方案

    编者按 与传统意义上的红包相比 xff0c 近两年火起来的 红包 xff0c 似乎才是如今春节的一大重头戏 历经上千年时代传承与变迁 xff0c 春节发红包早已成为历史沉淀的文化习俗 xff0c 融入了民族的血脉 按照各家公布的数据 xff
  • iOS 富文本所有的NSAttributedStringKey

    NSAttributedStringKey xff1a 1 NSFontAttributeName 字体 xff0c value是UIFont对象 2 NSParagraphStyleAttributeName 绘图的风格 xff08 居中
  • android抓取logcat日志的方法

    这几天帮忙测试一个APP xff0c 报告结果需要提交日志文件 xff0c 于是百度了下安卓的获取日志方法 xff0c 其实很简单 xff0c 7个步骤搞定 xff0c 下面把我的总结分享给大家 1 下载adb工具包 https pan b
  • 如何获得大学教材的PDF版本?

    最近急需一本算法书的配套答案 xff0c 这本配套单独出售 xff0c 好像在市面上还买不到 xff0c 在淘宝上搜索也只是上一个版本 xff0c 并没有最新版本 xff0c 让我很无奈 加上平时肯定会有这么一种情况 xff0c 想看一些书
  • 创新的力量

    创新是个非常好的词 xff0c 虽然这个词已经被用滥了 xff0c 但我依然固执的认为这是一个充满了迷人光辉的词汇 如果把创新放入科技领域 xff0c 这应该是我在科技领域最喜欢的一个词了 我常常对同事或团队的成员说 xff0c 我们在做产
  • mysql连接池

    文章出处 https www cnblogs com wupeiqi articles 8184686 html DBUtils是Python的一个用于实现数据库连接池的模块 此连接池有两种连接模式 xff1a 模式一 xff1a 为每个线