一种水电数据库自动建表分表的方法技术

技术编号:24206141 阅读:24 留言:0更新日期:2020-05-20 14:44
本发明专利技术公开了一种利用虚拟数据库技术实现水电数据库自动建表分表的方法。本方法基于标准的数据库底层通讯协议构建虚拟逻辑数据库,通过拦截数据库会话的存取数据请求,对sql语句进行过滤、分类、辨别和解析,实现数据库子表自动创建和数据水平切分,保证水电数据库单表数据可以按照点号、时间以及其它属性进行均匀分布。本发明专利技术的方法极大地提高了大数据单表的读写速度,简化了业务系统的数据访问逻辑,而且成本低廉。该方法可以根据现场的工程环境按照指定的表字段定制各种策略的分表算法,动态地将业务系统的单表请求自动转换成多表请求,避免数据库单表数据过大带来的性能下降。

A method of automatically creating tables and tables in hydropower database

【技术实现步骤摘要】
一种水电数据库自动建表分表的方法
本专利技术涉及用于水利和发电专业大数据存储等科学研究中的大规模测量数据存储和访问,尤其涉及一种水电数据库自动建表分表的方法。
技术介绍
如今随着智能化水电厂的发展,数据的量级也是呈指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。而水电业务的使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。目前水电系统所使用的商用数据库或者开源数据库一般都不支持大规模自动建表扩展,单表上面存在着性能瓶颈。一般的数据库单表超过1000W~2000W条记录时,性能就会有比较明显的下降。为了提升性能以及可以存储数据的量,需要针对工程特点、水电各专业特点等进行分表。对于数据量很大的表(千万级以上),关系型数据库性能会有很大下降,因此尽量控制在每张表的大小在百万级别。对于数据量很大的一张表,可以考虑将这些记录按照一定的规则通过分片放到不同的数据表里面。这样每个数据表的数据量不是太大,性能也不会有太大损失。数据库分片指:通过某种特定的条件,将存放在一个数据库表中的数据分散存放在不同的多个数据表中,这样来达到分散单表的容积,当数据库表分片后,数据由一个数据表分散到多个数据表中。此时系统要查询时需要切换不同的数据表进行查询,那么系统如何知道要查询的数据在哪个数据表中,当添加一条记录时要向哪个数据表中插入呢。
技术实现思路
本专利技术的目的是展示利用虚拟数据库技术实现一个低成本高效率可以无限扩展的水电行业自动建表分表的方法。虚拟数据库技术就是构建一个逻辑数据库,它利用标准的数据库通讯协议对外提供无差别的数据库访问服务。所有的水电业务组件和模块的数据访问层统一访问逻辑库,由这个虚拟逻辑库去统一管理数据子表的访问和路由。该方法能够根据水电业务提交的各种数据库请求进行解析,精确为所有请求路由至不同的子表进行真实数据库访问,对访问的结果按照请求类型进行合并和排序反馈回水电业务端,水电业务端完全不需了解底层数据库的细节。本专利技术的技术方案:一种水电数据库自动建表分表的方法,包括以下步骤:1)虚拟数据库前端按照mysql数据库标准底层通讯协议建立数据库服务侦听,后端按照真实的数据库连接信息、用户名和密码建立物理数据库连接线程池,水电业务系统按照真实的mysql的链接信息连接到虚拟数据库;2)水电业务系统的数据访问层向虚拟数据库提交sql请求,虚拟数据库侦听到sql请求语句,将sql请求语句进行解析,比对预设的分表表名和分表算法,查看该条sql请求语句是否需要进行分表处理;如果该条语句无需进行分表处理,直接将该请求提交至后端物理数据库;3)对于需要进行分表处理的sql请求语句,解析语句查询条件,根据预设的分表算法计算出该条语句涉及的子表名称,按语句类型、排序和分组进行类别归类;4)根据子表名称查询子表缓存,查看子表在物理数据库是否存在,如果不存在,在物理数据库创建相应的子表,如果存在该子表,表示该子表已经被创建,则进入步骤5),对该子表进行请求提交;5)对提交的sql请求语句进行修正,将其拆分成多个子表请求,将所有请求异步提交给物理数据库执行,将每个子表请求的返回结果放置缓存于结果集;等待所有子表请求完成,进入步骤6)进行结果集合并;6)所有的子查询结果集按照步骤3)整理的类别进行归并处理,将归并的结果集按照标准的mysql协议返回给水电业务系统。进一步地,步骤2)中,分表处理的方法为:通过sql语法分析器,将输入sql请求语句的查找条件、子查找条件和分表字段值处理进行缓存分析,循环计算分表范围,确定所有的分片节点以后,对所有分片并行进行子表语句执行。进一步地,分表处理的内容包括定义表的分片规则来实现分片,每个表格捆绑一个分片规则,每个分片规则指定一个分片字段并绑定一个函数,来实现动态分片算法。进一步地,当用来进行分表的逻辑库收到一个SQL请求语句时,先解析这个SQL请求语句,查找涉及到的表,然后查看此表的定义,如果有分片规则,则获取到SQL请求语句里分片字段的值,并匹配分片函数,得到该SQL请求语句对应的分片列表,然后将SQL请求语句发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端。进一步地,步骤4)中,子表创建的步骤为:预先设置子表创建脚本模板,当子表不存在时,子表结构直接模仿主表进行复制创建。进一步地,将主表的约束和主表触发器复制给子表,相关的约束和触发器按照模板进行自动创建。进一步地,步骤6)中的归并处理包括再排序和分组。进一步地,在所述虚拟数据库定义线程池,与真实的物理数据库建立连接,当多条sql请求语句请求处理时,并发构建多个会话和物理数据库进行通讯。进一步地,所述虚拟数据库中的分表配置中心构建有分表算法注册中心,直接参与分表的表名、字段名以及指定分表算法的实现类路径。本专利技术的优点:对比以往的数据库分库分表方法,本方法主要在以下方面取得了改进:一、提供基于标准数据库通讯协议的数据库服务,对客户端屏蔽数据库分表的细节,实现数据库分表与应用业务数据访问的解耦,大大减少应用程序数据访问的复杂性。二、基于预先定义的库表构建脚本模板,实现了库表以及库表相关的约束、触发器的自动生成,理论上可实现库表自动无限扩充。三、充分利用了异步现场sql提交,极大地提高了数据查询的速度。四、通过代理拦截,将分表算法独立于数据访问逻辑,分表策略可根据工程现状进行二次开发,充分满足个性化的分表需求,降低了开发成本。附图说明图1为本专利技术的分表示意图;图2为本专利技术的分片规则示意图;图3为本专利技术的框架组件图;图4为本专利技术的工作流程图。具体实施方式本专利技术的利用虚拟数据库技术实现水电数据库自动建表分表的方法,如图4所示,其过程是包括以下步骤:1)虚拟数据库程序前端按照mysql数据库标准底层通讯协议建立数据库服务侦听,后端按照真实的数据库连接信息、用户名和密码等建立物理数据库连接线程池,水电业务系统按照真实的mysql的链接信息连接到虚拟数据库。2)水电业务系统数据访问层向虚拟库提交数据库的sql请求,虚拟库侦听到sql请求,将sql语句进行解析,比对预先设定的分表表名和分表算法,查看该条sql语句是否需要进行路由和分片。如果该条语句无需进行分表处理,直接将该请求提交至后端物理数据库。3)对于需要进行分表的sql语句,解析语句查询条件,根据该工程的分表算法计算出该条语句涉及的子表名称,对语句类型、排序、分组等进行类别归类4)查询子表缓存,查看子表在物理数据库是否存在,如果不存在,在物理库构建相应的子表,将主表的约束和主表触发器复制给子表并重新命名。如果存在该子表,表示该子表已经被创建,则进入第5步,对该子表进行请求提交。5本文档来自技高网...

【技术保护点】
1.一种水电数据库自动建表分表的方法,其特征是,包括以下步骤:/n1) 虚拟数据库前端按照mysql数据库标准底层通讯协议建立数据库服务侦听,后端按照真实的数据库连接信息、用户名和密码建立物理数据库连接线程池,水电业务系统按照真实的mysql的链接信息连接到虚拟数据库;/n2) 水电业务系统的数据访问层向虚拟数据库提交sql请求,虚拟数据库侦听到sql请求语句,将sql请求语句进行解析,比对预设的分表表名和分表算法,查看该条sql请求语句是否需要进行分表处理;如果该条语句无需进行分表处理,直接将该请求提交至后端物理数据库;/n3) 对于需要进行分表处理的sql请求语句,解析语句查询条件,根据预设的分表算法计算出该条语句涉及的子表名称,按语句类型、排序和分组进行类别归类;/n4) 根据子表名称查询子表缓存,查看子表在物理数据库是否存在,如果不存在,在物理数据库创建相应的子表,如果存在该子表,表示该子表已经被创建,则进入步骤5),对该子表进行请求提交;/n5) 对提交的sql请求语句进行修正,将其拆分成多个子表请求,将所有请求异步提交给物理数据库执行,将每个子表请求的返回结果放置缓存于结果集;等待所有子表请求完成,进入步骤6)进行结果集合并;/n6) 所有的子查询结果集按照步骤3)整理的类别进行归并处理,将归并的结果集按照标准的mysql协议返回给水电业务系统。/n...

【技术特征摘要】
1.一种水电数据库自动建表分表的方法,其特征是,包括以下步骤:
1)虚拟数据库前端按照mysql数据库标准底层通讯协议建立数据库服务侦听,后端按照真实的数据库连接信息、用户名和密码建立物理数据库连接线程池,水电业务系统按照真实的mysql的链接信息连接到虚拟数据库;
2)水电业务系统的数据访问层向虚拟数据库提交sql请求,虚拟数据库侦听到sql请求语句,将sql请求语句进行解析,比对预设的分表表名和分表算法,查看该条sql请求语句是否需要进行分表处理;如果该条语句无需进行分表处理,直接将该请求提交至后端物理数据库;
3)对于需要进行分表处理的sql请求语句,解析语句查询条件,根据预设的分表算法计算出该条语句涉及的子表名称,按语句类型、排序和分组进行类别归类;
4)根据子表名称查询子表缓存,查看子表在物理数据库是否存在,如果不存在,在物理数据库创建相应的子表,如果存在该子表,表示该子表已经被创建,则进入步骤5),对该子表进行请求提交;
5)对提交的sql请求语句进行修正,将其拆分成多个子表请求,将所有请求异步提交给物理数据库执行,将每个子表请求的返回结果放置缓存于结果集;等待所有子表请求完成,进入步骤6)进行结果集合并;
6)所有的子查询结果集按照步骤3)整理的类别进行归并处理,将归并的结果集按照标准的mysql协议返回给水电业务系统。


2.根据权利要求1所述的水电数据库自动建表分表的方法,其特征是,步骤2)中,分表处理的方法为:通过sql语法分析器,将输入sql请求语句的查找条件、子查找条件和分表字段值处理进行缓存分析,循环计算分表范围,确定所有的分片节点以后,对所有分片并行进行子表语句执行。

【专利技术属性】
技术研发人员:陈意郑键兵花胜强蔡杰丁琳吴宁李宁宁向南周锡琅
申请(专利权)人:南京南瑞水利水电科技有限公司
类型:发明
国别省市:江苏;32

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1