首页 > 数据库 >数据库连接池 - Pymysql

数据库连接池 - Pymysql

时间:2023-04-24 22:25:37浏览次数:42  
标签:cursor 数据库 Pymysql ------- sleep pymysql conn import 连接池

最近想用小程序来做个移动BI, 然后涉及后端接口部分打算用 Python 的 flask 框架整一波, 主要听闻它比较轻量, 简单和可灵活配置, 这就和我很对味. 毕竟我主要搞数据用的就是 sql 而已, 只要有个服务器提供接口就行. 真正开始来写接口的时候, 就遇到这个数据库的问题, 关于查询效率, 和优雅.

我在工作中偶尔有一些数据处理或者逻辑分析的场景下, 即不通过BI平台, 大量用 pandas + sql 来操作. 我们数据的 ADS 层几乎都在 mysql 故用这个 pymysql 作为驱动连接工具是很好用的.

低频分析查询-随便搞

针对低频查询数据, 通常写法是这样的:

import pymysql

# 1.创建连接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='123456',
    db='cj'
)

# 3.创建游标
cursor = conn.cursor()

# 4. 执行sql语句和获取数据, 以经典的超市数据为例
cursor.execute('select order_id, province from market limit 2;')
data = cursor.fetchall()
print(data)

# 5. 关闭连接(同时也就关闭了cursor, 不关可能造成锁表)
conn.close()

(('US-2023-1357144', '浙江'), ('CN-2023-1973789', '四川'))

高频分析查询-连接池

但如果变成了web, 每次访问接口都要查询数据, 如果每次都要重新进行 connect 那这个就有点低效了.

若在外层只连接一次, 重复用 cursor 的话又可能会造成锁表和线程异常问题.

因此, 创建一个数据库连接池来进行任务管理是非常必要的. 即可通过一个 pool 来自动创建多个连接和资源回收, 这样就又高效又优雅.

在 pyhton 中, 我们用 dbutils 用作池管理, 驱动还是用 pymysql, 写法如下:

import pymysql 
from pymysql import cursors
from dbutils.pooled_db import PooledDB


pool = PooledDB(
    creator=pymysql,
    # 创建最大连接
    maxconnections=6,
    mincached=2,
    maxcached=3,
    maxshared=4,
    blocking=True,
    maxusage=None,
    setsession=[],
    ping=0,
    # 这一坨会传给上面的 pymysql
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='123456',
    database='cj',
    charset='utf8',
    # 让查询结果是一个 dict
    cursorclass=cursors.DictCursor
)


# 使用上和 mysql 是一样的
conn = pool.connection()
cursor = conn.cursor()

cursor.execute('select order_id, province from market limit 2;')
data = cursor.fetchall()
print(data)

# 这里并没有关闭连接, 而是放进了连接池 pool 
conn.close()

结果也是一样的.

(('US-2023-1357144', '浙江'), ('CN-2023-1973789', '四川'))

模拟多用户请求

上面的作用不太直观, 这里用多线程 threading 来模拟多请求的情况. 假设每次最大连接 3次, 至少1次的配置,

通过 sleep 减速一下则可以看到每次 3个连接这样, 一波波处理:

import pymysql 
from pymysql import cursors
from dbutils.pooled_db import PooledDB


pool = PooledDB(
    creator=pymysql,
    # 创建最大连接, 这里假设搞个3
    maxconnections=3,
    mincached=1,
    maxcached=3,
    maxshared=4,
    blocking=True,
    maxusage=None,
    setsession=[],
    ping=0,
    # 这一坨会传给上面的 pymysql
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='123456',
    database='cj',
    charset='utf8',
    # 让查询结果是一个 dict
    cursorclass=cursors.DictCursor
)


# 模拟多个请求的情况


from threading import Thread

def task(num):
    conn = pool.connection()
    cursor = conn.cursor()

    cursor.execute('select sleep(3);')
    data = cursor.fetchall()

    print(num, '-------', data)
    conn.close()

# 多线程任务测试
for i in range(20):
    t = Thread(target=task, args=(i,))
    # 启动
    t.start()
    


一波波的输出如下:

2 ------- [{'sleep(3)': 0}]
1 ------- [{'sleep(3)': 0}]
3 ------- [{'sleep(3)': 0}]

0 ------- [{'sleep(3)': 0}]
4 ------- [{'sleep(3)': 0}]
5 ------- [{'sleep(3)': 0}]

7 ------- [{'sleep(3)': 0}]
6 ------- [{'sleep(3)': 0}]
10 ------- [{'sleep(3)': 0}]

8 ------- [{'sleep(3)': 0}] 
11 ------- [{'sleep(3)': 0}]
9 ------- [{'sleep(3)': 0}] 

14 ------- [{'sleep(3)': 0}]
12 ------- [{'sleep(3)': 0}]
15 ------- [{'sleep(3)': 0}]

13 ------- [{'sleep(3)': 0}]
16 ------- [{'sleep(3)': 0}]
18 ------- [{'sleep(3)': 0}]

17 ------- [{'sleep(3)': 0}]
19 ------- [{'sleep(3)': 0}]

可以看到连接池简直太优秀了, 非常实用和优雅呀.

标签:cursor,数据库,Pymysql,-------,sleep,pymysql,conn,import,连接池
From: https://www.cnblogs.com/chenjieyouge/p/17351138.html

相关文章

  • 数据库校验用户准备工作与数据库校验用户核心代码实现
    数据库校验用户准备工作实现数据库检验用户从之前的分析我们可以知道,我们可以自定义一个UserDetailsService,让SpringSecurity使用我们的UserDetailsService。我们自己的UserDetailsService可以从数据库中查询用户名和密码。......
  • 在mac上使用docker部署Mongo数据库
    拉取镜像打开网址https://hub.docker.com/,搜索mongo,https://hub.docker.com/_/mongo执行命令dockerpullmongo启动容器执行命令dockerimage,查看到mongo的tag是5.0.16启动命令dockerrun-dit--namemongo5-p27017:27017-v/Users/huidongma/data/mongodb:......
  • [AHK]用ADOX创建Access数据库
    ;CreateadatabaseusingADOXoCatalog:=ComObjCreate("ADOX.Catalog")oCatalog.Create(sConnectionString)oTable:=ComObjCreate("ADOX.Table")oTable.Name:="MyTable"oTable.Columns.Append("ID",3)......
  • 61 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库用户
    61openEuler22.03-LTS搭建MySQL数据库服务器-管理数据库用户61.1创建用户可以使用CREATEUSER语句来创建一个或多个用户,并设置相应的口令。CREATEUSER'username'@'hostname'IDENTIFIEDBY'password';其中:username:用户名。hostname:主机名,即用户连接数据库时所在的主......
  • 达梦数据库使用disql登录, 密码包含特殊字符(@)的处理方法
    一、背景  用户密码是:dm@ABcC123,包含@这个特殊符号。 disql客户端连接数据库的方式是:disqlusername/password@IP:PORT  那么,这个时候,密码也包含@,这个符号,该怎么处理呢? 二、处理方法 1、密码用双引号括起来,"dm@ABcC123"2、对双引号加转义,\"dm@ABcC123\"......
  • 数据库查询权限信息代码实现
    ​我们只需要根据用户id去查询到其所对应的权限信息即可​所以我们可以先定义个mapper,其中提供一个方法可以根据userid查询权限信息创建对应的mapper文件,定义对应的sql语句 在application.yml中配置mapperXML文件的位置 ​然后我们可以在UserDetailsServiceImpl中去调......
  • 2023云数据库技术沙龙MySQL x ClickHouse专场成功举办
    4月22日,2023首届云数据库技术沙龙MySQLxClickHouse专场,在杭州市海智中心成功举办。本次沙龙由玖章算术、菜根发展、良仓太炎共创联合主办。围绕“技术进化,让数据更智能”为主题,汇聚字节跳动、阿里云、玖章算术、华为云、腾讯云、百度的6位数据库领域专家,深入MySQLxClickHo......
  • 从数据库查询权限信息 准备工作
     RBAC权限模型(Role-BasedAccessControl)即:基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型 准备工作创建数据库表CREATETABLE`sys_menu`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`menu_name`varchar(64)NOTNULLDEFAULT'NULL'COMME......
  • FIT2094 数据库设计
    FIT2094DatabasesNormalisationandLogicalDatabaseDesign-CleanUpInc(CUI)FACULTYOFINFORMATIONTECHNOLOGYGiventheprovidedcasestudyfromassignment1A,andadditionalforms/documentsrelatedtothecasestudy,studentswillbeaskedtotrans......
  • 医院核心数据库一体化建设实践
     建设背景 “以数据为核心资源的数字化时代,正在成为引领和推动新一轮科技革命的核心力量,将会深刻影响卫生健康行业。”这是四月份发布的《公立医院运营管理信息化功能指引》中对数据重要性的描述。数据库作为数据的载体,支撑着整个业务系统,发挥着非常重要的作用,被喻为“IT的心......