mysql 连接池 多线程_Python3 多线程(连接池)操作MySQL插入数据

1.主要模块

DBUtils : 允许在多线程应用和数据库之间连接的模块套件

Threading : 提供多线程功能

2.创建连接池

PooledDB 基本参数:

mincached : 最少的空闲连接数,如果空闲连接数小于这个数,Pool自动创建新连接;

maxcached : 最大的空闲连接数,如果空闲连接数大于这个数,Pool则关闭空闲连接;

maxconnections : 最大的连接数;

blocking : 当连接数达到最大的连接数时,在请求连接的时候,如果这个值是True,请求连接的程序会一直等待,直到当前连接数小于最大连接数,如果这个值是False,会报错;

CODE :

def mysql_connection():

maxconnections= 15# 最大连接数

pool=PooledDB(

pymysql,

maxconnections,

host='localhost',

user='root',

port=3306,

passwd='123456',

db='test_DB',

use_unicode=True)returnpool

# use>> pool =mysql_connection()>> con = pool.connection()

3.数据预处理

文件格式:txt

共准备了四份虚拟数据以便测试,分别有10万, 50万, 100万, 500万行数据

MySQL表结构如下图:

31753a0b9546d490ff8f33c54540940f.png

数据处理思路 :

每一行一条记录,每个字段间用制表符 “\t” 间隔开,字段带有双引号;

读取出来的数据类型是 Bytes ;

最终得到嵌套列表的格式,用于多线程循环每个任务每次处理10万行数据;

格式 : [ [(A,B,C,D), (A,B,C,D),(A,B,C,D),…], [(A,B,C,D), (A,B,C,D),(A,B,C,D),…], [], … ]

CODE :

import re

import time

st=time.time()

with open("10w.txt", "rb") asf:

data&

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误通常是由于多个线程同时使用同一个 MySQL 连接引起的。在 Python 的多线程环境中,MySQL 连接不是线程安全的,因此在多线程程序中使用连接池时,需要确保每个线程都有自己独立的连接。 你可以尝试以下解决方案: 1. 使用 threading.local() 创建一个线程局部变量,每个线程都可以在该变量中保存自己的连接对象。 ```python import threading import pymysql # 创建线程局部变量 local = threading.local() def get_connection(): # 检查当前线程是否已经有连接,如果有则直接返回 if hasattr(local, 'conn'): return local.conn # 创建新的连接 conn = pymysql.connect(host='your_host', user='your_user', password='your_password', database='your_database') # 保存连接到线程局部变量 local.conn = conn return conn def release_connection(conn): # 关闭连接 conn.close() # 从线程局部变量中删除连接 del local.conn # 在每个线程中使用连接 def worker(): conn = get_connection() # 使用连接进行数据操作 # 最后记得释放连接 release_connection(conn) ``` 2. 使用 `with` 语句管理连接的生命周期,确保每个线程在使用完连接后都能正确地关闭和释放它。 ```python import threading import pymysql # 创建线程局部变量 local = threading.local() def worker(): # 获取连接 with get_connection() as conn: # 使用连接进行数据操作 # 连接上下文管理器 class ConnectionContext: def __enter__(self): # 在进入上下文时获取连接 self.conn = pymysql.connect(host='your_host', user='your_user', password='your_password', database='your_database') return self.conn def __exit__(self, exc_type, exc_val, exc_tb): # 在退出上下文时关闭连接 self.conn.close() def get_connection(): # 检查当前线程是否已经有连接,如果有则直接返回 if hasattr(local, 'conn'): return local.conn # 创建新的连接 conn = ConnectionContext() # 保存连接到线程局部变量 local.conn = conn return conn ``` 以上是两种常见的解决方案,你可以根据自己的需求选择其中一种。同时,也建议使用连接池库来方便地管理和获取数据库连接,例如 `pymysqlpool` 或 `DBUtils`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值