python 并发访问数据库_【数据库】如何实现python3实现并发访问水平切分表
本篇文章给大家带来的内容是关于如何实现python3实现并发访问水平切分表,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
场景说明
假设有一个mysql表被水平切分,分散到多个host中,每个host拥有n个切分表。
如果需要并发去访问这些表,快速得到查询结果, 应该怎么做呢?
这里提供一种方案,利用python3的asyncio异步io库及aiomysql异步库去实现这个需求。
代码演示
import logging
import random
import asynciofrom aiomysql
import create_pool
# 假设mysql表分散在8个host, 每个host有16张子表
TBLES = { "192.168.1.01": "table_000-015",
# 000-015表示该ip下的表明从table_000一直连续到table_015
"192.168.1.02": "table_016-031",
"192.168.1.03": "table_032-047",
"192.168.1.04": "table_048-063",
"192.168.1.05": "table_064-079",
"192.168.1.06": "table_080-095",
"192.168.1.07": "table_096-0111",
"192.168.1.08": "table_112-0127",
}
USER = "xxx"PASSWD = "xxxx"# wrapper函数,用于捕捉异常def query_wrapper(func):
async def wrapper(*args, **kwargs):
try:
await func(*args, **kwargs) except Exception as e:
print(e) return wrapper
# 实际的sql访问处理函数,通过aiomysql实现异步非阻塞请求@
query_wrapperasync def query_do_something(ip, db, table):
async with create_pool(host=ip, db=db, user=USER, password=PASSWD) as pool:
async with pool.get() as conn:
async with conn.cursor() as cur:
sql = ("select xxx from {} where xxxx")
await cur.execute(sql.format(table))
res = await cur.fetchall()
# then do something...# 生成sql访问队列, 队列的每个元素包含要对某个表进行访问的函数及参数def gen_tasks():
tasks = [] for ip, tbls in TBLES.items():
cols = re.split('_|-', tbls)
tblpre = "_".join(cols[:-2])
min_num = int(cols[-2])
max_num = int(cols[-1])
for num in range(min_num, max_num+1):
tasks.append(
(query_do_something, ip, 'your_dbname', '{}_{}'.format(tblpre, num))
)
random.shuffle(tasks)
return tasks# 按批量运行sql访问请求队列def run_tasks(tasks, batch_len):
try:
for idx in range(0, len(tasks), batch_len):
batch_tasks = tasks[idx:idx+batch_len]
logging.info("current batch, start_idx:%s len:%s" % (idx, len(batch_tasks)))
for i in range(0, len(batch_tasks)):
l = batch_tasks[i]
batch_tasks[i] = asyncio.ensure_future(
l[0](*l[1:])
)
loop.run_until_complete(asyncio.gather(*batch_tasks))
except Exception as e:
logging.warn(e)# main方法, 通过asyncio实现函数异步调用def main():
loop = asyncio.get_event_loop()
tasks = gen_tasks()
batch_len = len(TBLES.keys()) * 5 # all up to you
run_tasks(tasks, batch_len)
loop.close()
python 并发访问数据库_【数据库】如何实现python3实现并发访问水平切分表相关推荐
- 数据库_数据库篇-第一章:数据库基本概念
基础知识学习,面试必备,关注吧 骚年 01 第一,什么是数据库? 维基百科上是这样定义的: 所谓"数据库"是以一定方式储存在一起.能予多个用户共享.具有尽可能小的冗余度.与应用程序 ...
- webapp支持什么数据库_数据库和Webapp安全
webapp支持什么数据库 威胁模型 这是根据我网站上的快速参考页松散地讨论数据库和webapp安全的问题. 该页面变得笨拙,并且使读者无法轻松地与我或其他人进行交互. 威胁模型 所有安全分析必须从检 ...
- 1MySQL是面向对象型数据库_数据库及MySQL基础(1)
一.数据库概述 关系型数据库:面对关系,Java面向对象.html ·常见数据库mysql Oracle(神喻):甲骨文 DB2:IBM SQL Server:微软 Sybase:赛尔斯 MySQL: ...
- mysql语句数据库_数据库的Mysql语句
数据库的mysql语句: 1.连接数据库 mysql -u root -p 2.显示数据库 show databases(db); 3.选择数据库 use 数据库名; 4.显示数据库中的表 show ...
- python非法变量名_数据库错误:ORA-01036:非法变量名/numb
我认为您误解了绑定变量如何与Oracle和cx_Oracle一起工作. Oracle将SQL查询中的:myvar等表达式识别为绑定变量占位符.当遇到这种情况时,它会注意到在运行查询之前它需要这个变量的 ...
- python飞机票预定系统_数据库课程设计 - 机票预订系统
一.机票预定系统 1.1 题目要求 要求具备如下基本功能 班机基本信息的管理: 航班信息的管理: 旅客预定机票.取消预约.付款取票.退票的管理: 查询航班信息.航班预定情况.旅客信息,计算航班满座率. ...
- python 乱码转码_数据库乱码问题 Python 编码问题(Unicode 的 encode、decode 相互转换 )...
前言: 今天有个项目需要合并(A合并到B),我所做的就是数据库的合并操作,其中出现的主要问题就是乱码的问题.乱码这个问题是很常见的问题,今天整理了下自己所理解的一点见解. 案例: NAME COMPA ...
- java用户名检查数据库_登入界面账号密码是访问数据库,但登入问题时if判断时就是执行不了...
回复 2楼 林月儿 我按着你的方法试了下,可还是这个判断不能执行 if(password.equals(drmm.getText())){ view.setTex ...
- java 数据结构 数据库_数据库索引背后的数据结构
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法.这种数据结构,就是索引. B-Tree B-Tree是一种 ...
最新文章
- 对抗软件系统复杂性①:如无必要,勿增实体
- 你还在认为 count(1) 比 count(*) 效率高?
- 8 - 9 template两大功能 : simple_tag、模板继承
- Foundation框架介绍
- python怎么读excel文件-python如何读写excel文件
- pytorch 笔记 :实现Dropout
- 卷死了!再不学vue3就没有人要你了!速来围观vue3新特性
- 特征计算 - 遍历求值提速 6 万倍 lambda...if...else(if...else...) +map() 对比 iterrows() - Python代码
- 讲故事形式解释什么是股票_讲故事的人可以教公开领导者什么
- 还在直接操作Redis?赶快来试试它....
- matlab打开矩阵表,如何将Excel数据导入MATLAB中?:EXCLE中通过矩阵表输出选项
- linux版本信息i686,Linux下如何查看版本信息
- gitee markdown 笔记_Gitee+PicGo+Pandoc+Typora组建markdown编辑器
- 带背景音乐的表白html,感人的表白背景音乐,适合浪漫表白的纯音乐
- Oracle掌管权限和角色
- 小程序微信JSAPI支付进行退款操作
- 计算机桌面文件能单独设密码吗,告诉你怎么给文件夹设置密码
- 方正飞鸿ES2007SOA工作流开发平台视频演示材料目录
- BIOS设置中功能的翻译及介绍
- php源码后台密码被改了,帝国cms后台密码重置插件后台密码恢复找回密码工具
热门文章
- Mysql的存储过程修改表的数据:项目上一个小练习
- Basic各编码每个字符占用字节个数
- c语言的查询功能,求C语言实现查询功能(如果选择3,如何实现查询)
- bootstrap table排序php,bootstraptable排序可以么
- java面试宝典有用么_常见的Java面试题汇总
- 删除ubuntu linux系统,从Windows双启动中卸载Ubuntu Linux
- python函数图像平移_[Python图像处理]六.图像缩放,图像旋转,图像翻转与图像平移...
- yum 错误:Invalid configuration value: failovermethod=priority
- 【Mybatis】 mapper XML 文件中使用 association 实现一对一关联
- 查看oracle连接数的消耗情况