CN106095878B - 基于分库分表的数据库操作装置及方法 - Google Patents
基于分库分表的数据库操作装置及方法 Download PDFInfo
- Publication number
- CN106095878B CN106095878B CN201610395908.6A CN201610395908A CN106095878B CN 106095878 B CN106095878 B CN 106095878B CN 201610395908 A CN201610395908 A CN 201610395908A CN 106095878 B CN106095878 B CN 106095878B
- Authority
- CN
- China
- Prior art keywords
- database
- script
- thread
- configuration file
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/21—Design, administration or maintenance of databases
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于分库分表的数据库操作装置及方法,其中,所述装置包括:加载模块,用于加载配置文件和数据库脚本;处理模块,用于根据所述配置文件为目标数据库创建线程池和数据库连接池,其中,所述线程池包括数据库级线程池、数据库表级线程池和篮子级线程池;执行模块,用于通过所述线程池和数据库连接池,根据所述目标数据库对应的数据库脚本执行针对所述目标数据库的数据库操作。采用本发明,能够支持在实施分库分表策略的背景下,对各个分库的高效且可配置地变更及维护。
Description
技术领域
本发明涉及数据处理领域,更为具体而言,涉及一种基于分库分表的数据库操作装置及方法。
背景技术
当数据库中存在某个表的数据量过大,比如千万甚至上亿条记录时,此时数据库操作会十分耗时。为了支持高并发、大数据量的访问场景,也为了提高数据库访问效率、减少数据库访问时间,现有技术提出了数据库的分库分表策略,以满足并发访问的非功能指标。而与此同时,分库分表策略的实施对数据库的变更和管理提出了新的挑战。
简单来讲,数据库的分库分表就是将原有的存储大量数据的表,按照某种规则,拆分成多个小数据量的表,并存储在多个数据库中。传统数据库的维护变更是针对单一数据源进行的。而针对分库分表场景,需要对多数据源的所有篮子进行相同的变更操作,工作量是成倍增长的。因此,在分库分表总体策略的影响下,业界迫切需要一种可以支持分库分表的数据库操作装置,来实现对数据库的维护和基本操作。
发明内容
鉴于现有技术的上述缺陷,本发明实施方式提供了一种基于分库分表的数据库操作装置及方法,能够支持在实施分库分表策略的背景下,对各个分库的高效且可配置地变更及维护。
具体地,本发明实施方式提供了一种基于分库分表的数据库操作装置,其包括:
加载模块,用于加载配置文件和数据库脚本;
处理模块,用于根据所述配置文件为目标数据库创建线程池和数据库连接池,其中,所述线程池包括数据库级线程池、数据库表级线程池和篮子级线程池;
执行模块,用于通过所述线程池和数据库连接池,根据所述目标数据库对应的数据库脚本执行针对所述目标数据库的数据库操作。
相应地,本发明实施方式还提供了一种基于分库分表的数据库操作方法,其包括:
加载配置文件和数据库脚本;
根据所述配置文件为目标数据库创建线程池和数据库连接池,其中,所述线程池包括数据库级线程池、数据库表级线程池和篮子级线程池;
通过所述线程池和数据库连接池,根据所述目标数据库对应的数据库脚本执行针对所述目标数据库的数据库操作。
采用本发明实施方式,具有以下优点:
1)能够支持在实施分库分表策略的背景下,对各个分库的变更及维护。具体而言,通过加载配置文件和数据库脚本并执行数据库脚本,可以在各个分库中,对每个篮子执行相应脚本的变更内容。
2)通过数据库连接池和多线程技术,可以并发执行所有分库、分表的数据库变更,保证了一定的性能,提升了整体的执行效率。
3)通过更改配置文件和数据库脚本,可以灵活地变更或修改具体的数据库操作,提高数据库操作装置的易用性。
4)通过提供丰富的日志记录功能,不仅包括重跑日志,还包括工具执行过程信息,语句日志,语句结果日志,基于库和篮子的统计分析日志等,便于追踪问题和掌握执行情况。
5)提供了失败或出错的重跑功能。当执行过程中,对某个脚本在某个库的某个篮子做变更时,遇到环境或脚本错误导致变更提交失败的情况下,不仅可以记录成功执行的库和篮子,还可以记录执行错误的篮子和对应的脚本信息。而通过重跑指令,可以针对失败内容进行重跑或多次重跑。
附图说明
图1是根据本发明实施例的一种基于分库分表的数据库操作装置的框图的一例;
图2是图1所示数据库操作装置的处理模块的框图的一例;
图3是图1所示数据库操作装置的执行模块的框图的一例;
图4是根据本发明实施例的一种基于分库分表的数据库操作方法的流程示意图。
具体实施方式
为了便于理解本发明技术方案的各个方面、特征以及优点,下面结合附图对本发明进行具体描述。应当理解,下述的各种实施方式只用于举例说明,而非用于限制本发明的保护范围。
首先,对本发明中涉及或可能涉及的名词或术语进行解释。
分库分表策略:数据库的分库分表,简单来说就是将原有的存储大量数据的表,按照某种规则,拆分成多个小数据量的表,并存储在多个数据库中。在执行数据库操作时,根据传入的key(键)值,按照某种计算规则,计算出要访问的是哪个数据库的哪张数据表。
篮子(bucket):按照分库分表策略,数据模型的设计是面向具体应用的,当实施时,需要把同一个模型部署在多个数据库的多个相同表结构的不同表上。这些不同的表的命名遵循一定的规则,即以相同的模型名称作前缀,以不同的编号作结尾。在这种规则下,可以看作不同的数据库表在同一个数据库里会“存储”到同一个“篮子”里。这里,对于同一张数据库表,在不同数据库中的每一个单位个体所对应的编号称之为篮子号。
分库分表工具:虽然分库分表策略的应用可以提高***并发吞吐量,但带来的数据库表维护工作量也是巨大的,分库分表工具就应运而生了。具体来说,分库分表策略从设计角度要求同一份代码对应到相同表结构的不同数据库的不同表上。而当发生数据库变更时,同一个变更要在所有对应的篮子上。如果没有专门的工具,难以保证变更的有效性和同步性。
数据库连接池:数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
线程池:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将***另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
Spring:Spring是一个轻量级Java开发框架,为解决企业用开发的复杂性而创建。具有分层架构、控制反转、面向切面等特点。
OpenFramework:建行新一代提出的基于Spring框架打造的开放环境通用技术框架(JAVA部分),也是各产品和平台的核心框架。
交换区:建行框架openframework中的一个组件,是应用服务在每次被访问时创建的共享内存,当创建后随着生命周期可被其他组件所共享,一般用来放置公共参数或共享数据,随着访问的结束而被释放和回收。
iBATIS:iBATIS一词来源于“internet”和“abatis”的组合,是一个由ClintonBegin在2002年发起的开放源代码项目。于2010年6月16号被谷歌托管,改名为MyBatis。是一个基于SQL映射支持Java和.NET的持久层框架。
DDL:数据库模式定义语言(Data Definition Language),用于描述数据库中要存储的现实世界实体的语言。
DML:数据操纵语言(Data Manipulation Language),用来对数据库里的数据进行操作的语言。
NB:只分库不分表的数据库变更语句。
SP:即存储过程(Stored Procedure)。是在大型数据库***中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
图1是根据本发明实施例的一种基于分库分表的数据库操作装置的框图的一例。参照图1,数据库操作装置包括加载模块12、处理模块14和执行模块16,下面分别进行说明。
在本实施例中,加载模块12用于加载配置文件和数据库脚本,其中,配置文件中配置有分库分表相关的信息,包括数据源配置清单、数据库表清单、篮子配置策略等。此外,配置文件还可以包含数据库操作装置的运行参数、展示给用户的菜单文件以及日志相关参数等。
在本实施例中,处理模块14用于根据所述配置文件为目标数据库创建线程池和数据库连接池,其中,所述线程池包括数据库级线程池、数据库表级线程池和篮子级线程池。更具体而言,数据库级线程池包括为各数据库创建的线程,数据库表级线程池包括为各数据库表创建的线程,篮子级线程池包括为各篮子创建的线程。
在本实施例中,执行模块16用于通过所述线程池和数据库连接池,根据所述目标数据库对应的数据库脚本执行针对所述目标数据库的数据库操作,例如,针对数据库的变更和维护。
采用本发明实施例提供的数据库操作装置,一方面,能够支持在实施分库分表策略的背景下,对各个分库的变更及维护。具体而言,通过加载配置文件和数据库脚本并执行数据库脚本,可以在各个分库中,对每个篮子执行相应脚本的变更内容。另一方面,通过数据库连接池和多线程技术,可以并发执行所有分库、分表的数据库变更,保证了一定的性能,提升了整体的执行效率。再一方面,通过更改配置文件和数据库脚本,可以灵活地变更或修改具体的数据库操作,提高数据库操作装置的易用性。
可选地,在本实施例的一种实现方式中,如图1中虚线框所示,数据库操作装置还包括执行入口模块10,用于接收用户输入并根据用户输入确定所述执行模块16所执行的数据库脚本。例如,数据库操作装置为用户提供选择菜单,根据用户选择确定执行哪个数据库脚本。
可选地,在本实施例的一种实现方式中,如图2所示,处理模块14包括:分库处理子模块142,用于根据所述配置文件中的数据源配置清单为所述目标数据库中的每一个创建数据库连接池和数据库级线程;分表处理子模块144,用于根据所述配置文件中的数据库表清单在各个所述目标数据库所对应的线程下,为对应的数据库表创建数据库表级线程,以及,根据所述配置文件中的篮子级线程个数的配置在各个数据库表级线程下,创建篮子级线程。
进一步可选地,分库处理子模块142还用于在所述执行模块16执行完对当前数据库的数据库操作后,关闭当前数据库所对应的数据库连接池,回收当前数据库对应的数据库级线程。分表处理子模块144还用于在执行模块16执行完对当前数据库表的任务(即,数据库脚本中针对数据库表的操作)之后,回收当前数据库表的线程,在执行模块16执行完对当前篮子的任务(即,数据库脚本中针对篮子的操作)之后,回收当前篮子的线程。
需要说明的是,在本发明中提及的“当前数据库”、“当前数据库表”、“当前篮子”是指数据库操作装置运行时所针对的数据库、数据库表以及篮子之意。
可选地,在本实施例的一种实现方式中,处理模块14还用于执行以下处理:根据所述配置文件中的数据源配置清单确定所述目标数据库,根据预设的数据库脚本配置文件确定所述目标数据库对应的数据库脚本;或者,根据记录数据库操作失败信息的重跑日志确定所述目标数据库,根据所述数据库脚本配置文件和所述重跑日志确定所述目标数据库对应的数据库脚本;其中,所述数据库脚本配置文件配置有所述目标数据库与所述数据库脚本的对应关系。
在本实现方式中,重跑日志可以由加载模块12加载,处理模块14根据重跑日志中记载的数据库操作失败信息定位操作失败的数据库以及数据库脚本(或者更精确地,定位执行失败的语句)。而在所述数据库脚本配置文件中可以配置目标数据库需要顺序执行的数据库脚本名,这样,结合重跑日志即可确定需要重跑的数据库脚本,即,在进行重跑时目标数据库对应的数据库脚本。其中,数据库脚本配置文件可以作为配置文件中的一种或一部分,也可以独立于配置文件之外,本领域技术人员可以灵活变更而并不影响本发明的实质技术方案。
可选地,在本实施例的一种实现方式中,如图3所示,执行模块16包括:脚本处理子模块,用于根据当前目标数据库所对应的篮子号及对应的数据库脚本生成实际执行的脚本语句;和执行子模块,用于执行所述实际执行的脚本语句,从而执行针对当前数据库的数据库操作。换言之,在将同一脚本应用于分库中的篮子时,根据脚本以及传入参数生成真正执行的脚本语句。在本实现方式中,传入参数为篮子号。在其它实现方式中,本领域技术人员可以根据需要设置传入参数,只要能够达到将同一脚本应用于多个分库或者各分库中的多个篮子即可。
可选地,在本实施例的一种实现方式中,所述数据库脚本包括数据库模式定义语言脚本、数据库操纵语言脚本、只分库不分表的数据库变更语句脚本和存储过程脚本。
图4是根据本发明实施例的一种基于分库分表的数据库操作方法的流程示意图,参照图4,所述方法包括:
402:加载配置文件和数据库脚本。
404:创建线程池和数据库连接池。具体而言,根据所述配置文件为目标数据库创建线程池和数据库连接池。其中,所述线程池包括数据库级线程池、数据库表级线程池和篮子级线程池。
406:执行数据库操作。具体而言,通过所述线程池和数据库连接池,根据所述目标数据库对应的数据库脚本执行针对所述目标数据库的数据库操作。
采用本实施例提供的方法,一方面,能够支持在实施分库分表策略的背景下,对各个分库的变更及维护。具体而言,通过加载配置文件和数据库脚本并执行数据库脚本,可以在各个分库中,对每个篮子执行相应脚本的变更内容。另一方面,通过数据库连接池和多线程技术,可以并发执行所有分库、分表的数据库变更,保证了一定的性能,提升了整体的执行效率。再一方面,通过更改配置文件和数据库脚本,可以灵活地变更或修改具体的数据库操作。
可选地,在本实施例的一种实现方式中,所述方法还包括:接收用户输入并根据用户输入确定所述执行模块所执行的数据库脚本。
可选地,在本实施例的一种实现方式中,404可以通过以下方式实现:根据所述配置文件中的数据源配置清单为所述目标数据库中的每一个创建数据库连接池和数据库级线程;根据所述配置文件中的数据库表清单在各个所述目标数据库所对应的线程下,为对应的数据库表创建数据库表级线程;根据所述配置文件中的篮子级线程个数的配置在各个数据库表级线程下,创建篮子级线程。
可选地,在本实施例的一种实现方式中,所述方法还包括:在执行完对当前数据库的数据库操作后,关闭当前数据库所对应的数据库连接池,回收当前数据库对应的数据库级线程。
可选地,在本实施例的一种实现方式中,所述方法还包括:在执行完对当前数据库表的任务之后,回收当前数据库表的线程;在执行完对当前篮子的任务之后,回收当前篮子的线程。
可选地,在本实施例的一种实现方式中,所述方法还包括:根据所述配置文件中的数据源配置清单确定所述目标数据库,根据预设的数据库脚本配置文件确定所述目标数据库对应的数据库脚本;或,根据记录数据库操作失败信息的重跑日志确定所述目标数据库,根据所述数据库脚本配置文件和所述重跑日志确定所述目标数据库对应的数据库脚本。其中,所述数据库脚本配置文件配置有所述目标数据库与所述数据库脚本的对应关系。
可选地,在本实施例的一种实现方式中,在406中,根据当前目标数据库所对应的篮子号及对应的数据库脚本生成实际执行的脚本语句,然后执行所述实际执行的脚本语句,从而执行针对当前数据库的数据库操作。
可选地,在本实施例的一种实现方式中,数据库脚本包括:数据库模式定义语言脚本、数据库操纵语言脚本、只分库不分表的数据库变更语句脚本和存储过程脚本。
在本发明中,通过采用本发明实施例提供的数据库操作装置可以实施本发明实施例提供的数据库操作方法,而本发明实施例提供的数据库操作方法又可以看作本发明提供的数据库操作装置的处理逻辑,二者在技术上相关联。因此,在数据库操作方法中,关于相关名词、术语、范围、条件以及相关关系的解释,以及关于各个实施例或实现方式所能达到的有益效果的说明,请参见装置实施例中的相应说明,此处不再赘述。
以上对根据本发明实施例的方法和装置实施例进行了详细说明。下面结合实际开发对本发明的部分内容进行示例性说明。
总体来说,数据库操作装置(或者称作分库分表工具)主要实现了以下功能:执行或重跑分库分表场景下的DDL和DML、存储过程脚本、分库不分表脚本;根据“篮子号”配置生成真正执行的SQL语句等。其具体实现主要包括用户操作入口(如执行入口模块10)、日志处理、文件处理(如加载模块12)、分库处理(如分库处理子模块142)、分表处理(如分库处理子模块144)。下面对相关处理分别进行说明。
【日志处理】
日志处理主要是指在装置运行过程中的日志记录。数据库操作装置是批量执行工具,当数据库、表、篮子数量较大时,若遇到执行异常,较难定位错误发生的位置,因此,需要数据库操作装置提供分类的日志输出功能。
每次数据库操作装置执行时,都会产生唯一的全局跟踪号,用于定位本次执行的操作日志。具体来说,工具的日志主要包括以下内容。
A)日志目录
B)日志命名规则
①执行过程中产生的日志的命名规则如下:
脚本类型_执行类型_全局跟踪号.log
说明如下:
脚本类型:DDL、DML、PRO、NB0等;
执行类型:J代表JDBC,当然还可以支持其他的方式;
全局跟踪号(traceID):用于一次数据库操作的唯一标识。
示例如下:
②存放待执行SQL语句文件的命名规则如下:
脚本类型_执行类型_全局跟踪号_表名.log
说明如下:
脚本类型:DDL、DML;
执行类型:J代表JDBC,当然还可以支持其他的方式;
全局跟踪号(traceID):用于一次数据库操作的唯一标识。
示例如下:
C)日志格式说明
【文件处理】
文件处理包括:加载配置文件和数据库脚本,以及读取重跑日志。
一、关于配置文件
配置文件所包含内容的示例性说明如下表所示:
二、关于通用配置
通用配置示例如下:
其中:
bktChar:表示需要分库分表执行时,在SQL脚本中需要被替换为篮子号的符号。示例如下:在SQL脚本中语句为:CREATE TALBE S11T1_AR_ACC_[X](…..),如果设置bktChar=[X],则在分库分表执行时,这里的[X]就会被替换为篮子号,如“000001”。所以真正在数据库里执行的语句为:CREATE TALBE S11T1_AR_ACC_000001(…..)。
encyptedFlag:表示数据库密码是否加密。“true”表示数据库密码是密文,“false”表示使用明文密码进行连接。
sqlLength:表示在记录日志时显示的SQL语句的字符总数。
genSql:表示需要分库分表执行时,是否需要生成文件存放真正的SQL语句。
bktThreadNum:表示需要分库分表执行时,设置的bktThread个数。
bktMapFlag:表示需要分库分表执行时,获取数据库和篮子号对应关系的方式。当取值为“FILE”表示从文件“basket_db_list.txt”中获取,否则为从数据库中读取。
bktMapSql:表示获取数据库和篮子号对应关系的方式为从数据库中读取时,查询用到的SQL语句。
三、关于重跑日志。
读取重跑日志是为了完成重跑功能。在因为数据库操作失败而重跑执行失败的脚本时,直接读取redoLog目录下修改时间最晚的重跑日志。redoLog中记录了执行失败的脚本信息,如果在某个脚本第一次执行过程中,遇到异常导致执行过程中断,那么未执行的sql语句不会记录在redoLog中,确切的说redoLog是对sqlExecLog中执行失败的脚本的重跑。
【用户操作入口】
用户操作入口即装置为用户提供的操作界面,其可以实现以下功能。
通过运行相关文件(例如,auto.sh),显示一级选择菜单。示例性地,一级选择菜单可以包括三个选项。1:JDBC执行脚本;2:JDBC重跑脚本;0:退出。
用户输入1进入JDBC方式执行脚本的二级菜单。示例性地,二级菜单可包括五个选项。1:分库分表执行DDL语句;2:分库分表执行DML语句;3:分库执行存储语句;4:分库执行SQL过程;0:退出。其中,选择1则按照分库和篮子号执行DDL语句;选择2则按照分库和篮子号执行DML语句;选择3则按照分库执行存储过程;选择4则直接在各个分库中执行sql语句,不再关联篮子号。
用户输入2进入JDBC方式重跑失败脚本的二级菜单。用户可以通过如下二级菜单选择对应的脚本类型来分别执行。1:分库分表重跑DDL语句;2:分库分表重跑DML语句;3:分库重跑存储过程;4:分库重跑SQL语句;0:退出。
【分库处理】
分库处理即多数据源处理。为解决多数据源问题,数据库操作装置提供了数据源配置清单db.lst,使用者可通过该清单配置和选择数据源,从而达到一次配置,同时变更的目的。
db.lst用于配置数据库操作装置需要连接的数据库连接信息,每个配置项之间用“|”分隔,每个数据库作为独立的一行,不可跨行,配置规则如下:
dbNum|sid|连接串|用户名|密码
@|idtejdb|jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=128.192.66.195)(PORT=1521))(LOAD_BALANCE=on)(FAILOVER=yes))(CONNECT_DATA=(SERVE R=dedicated)(SERVICE_NAME=idtejdb)))|idtej|idtej
1|ccs01|jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=128.192.71.162)(PORT=1521))(LOAD_BALANCE=on)(FAILOVER=yes))(CONNECT_DATA=(SERVE R=dedicated)(SERVICE_NAME=p8srv)))|ccs01|ccs01
2|ccs02|jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=128.192.71.162)(PORT=1521))(LOAD_BALANCE=on)(FAILOVER=yes))(CONNECT_DATA=(SERVE R=dedicated)(SERVICE_NAME=p8srv)))|ccs02|ccs02
其中,当dbNum为“@”时,表示该库是存放dbNum与篮子号对应关系的S11T1_BKTDBMAP表所在的集中库。其他的dbNum必须与该表中所存放的DB_NMBR字段存放的内容保持一致。sid是给每个db取得别名,会在日志中体现,可以采用数据库sid+dbNum的命名方式,应用也可以自己指定。
数据库操作装置在执行时根据每个数据库列表db.lst中的配置为每个数据库创建一个新线程,当每个库的操作都完成后对线程进行回收并汇总统计每个库上的数据库操作。
由于分表操作和篮子策略,每个库的数据库操作都会需要大量的数据库连接,频繁的创建和销毁数据库连接会影响整体执行效率。因此,数据库操作装置还引入了数据库连接池技术。数据库操作装置会根据db.lst为每个库创建一个连接池,可根据配置创建初始连接数、增量连接数、最大连接数和等待时间。当一次数据库操作发生时,可从数据库连接池中取到一个创建好的数据库连接,直接进行数据库操作,当操作完成后,连接并不会立刻被关闭,而是交回并暂存于数据库连接池中,当相同数据库下次再有操作发生时,会重新从连接池取到一个创建好的连接,直到数据库所有操作都完成,再关闭当前数据库的连接池,节省了创建和销毁的时间。
【分表处理】
分表处理即在各个库中真正执行的SQL脚本进行处理。首先针对不同的分库分表处理对象加载不同的数据库脚本配置文件,然后结合篮子的配置和待执行的数据库脚本,执行相应的数据库维护操作。
在分表处理时,在分库处理中为各个数据库创建的线程会根据table.lst中的配置对每张表创建新的子线程,当每张表的任务执行完成后同样会执行回收和收尾工作。而每张表的子线程会依据工具的配置文件config.properties中的配置bktThreadNum创建相同数量的子线程,每个子线程会从实际操作的篮子中抢占执行任务,直到所有任务都完成,再进行线程回收并交还数据库连接。
一:关于待执行脚本分类
/script目录用于存放待执行的SQL脚本。
二:关于数据库脚本配置
分库分表处理对象主要分为以下三类:DDL和DML、存储过程、NBSQL,对应的数据库脚本配置文件如下:
A)table.lst,用于配置分库分表执行时,DDL和DML按顺序待执行的table列表。配置规则如下(其中,tableName表示表名):
tableName|是否执行DDL|是否执行DML 0--不执行1--执行
示例如下:
其中的tableName和/script/ddl或者/script/dml目录下的文件名是一样的。如示例中的table.lst的配置,其在/script/ddl或者/script/dml目录下的文件名可以是如下所示:
B)proc.lst,用于配置在执行procdure,即存储过程时,按顺序待执行的存储过程列表,配置项为文件名。示例如下:
CC_TEST_MULTI_PROC.sql |
这里的文件名和/script/proc目录下的文件名是一样的,而且和存储过程名也是一样的。
C)nb.lst,用于配置仅分库执行而不需要分表执行时按顺序待执行的sql脚本列表,配置项为文件名。示例如下:
CC_TEST_MULTI_NB.sql |
nbsql指的是不需要按篮子号执行的sql语句,数据库操作装置会逐条取出该脚本中的sql语句,并且会在每个库中都执行一遍。
这里的文件名和/script/nbsql目录下的文件名是一样的。
三:关于篮子的配置与使用
当数据库表指定后,每个库的表名要按照“篮子”策略动态生成,篮子的策略通过数据库配置描述和指定。
basket_db_list:格式为“篮子号,数据库”,示例如下:
BKT_NMBR,DB_NMBR
其中,数据库编号指的是在db.lst中的数据库配置编号,同一个库的记录条数表示篮子的个数,每条记录表示当前数据库都有哪些篮子编号。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件结合硬件平台的方式来实现。基于这样的理解,本发明的技术方案对背景技术做出贡献的全部或者部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。
本领技术人员应当理解,以上所公开的仅为本发明的实施方式而已,当然不能以此来限定本发明之权利范围,依本发明实施方式所作的等同变化,仍属本发明权利要求所涵盖的范围。
Claims (12)
1.一种基于分库分表的数据库操作装置,其特征在于,所述装置包括:
加载模块,用于加载配置文件和数据库脚本;
处理模块,用于根据所述配置文件为目标数据库创建线程池和数据库连接池,其中,所述线程池包括数据库级线程池、数据库表级线程池和篮子级线程池;
执行模块,用于通过所述线程池和数据库连接池,根据所述目标数据库对应的数据库脚本执行针对所述目标数据库的数据库操作;
其中,所述数据库脚本包括:数据库模式定义语言脚本、数据库操纵语言脚本、只分库不分表的数据库变更语句脚本和存储过程脚本;
所述执行模块包括:
脚本处理子模块,用于根据当前目标数据库所对应的篮子号及对应的数据库脚本生成实际执行的脚本语句;
执行子模块,用于执行所述实际执行的脚本语句。
2.如权利要求1所述的装置,其特征在于,所述装置还包括:
执行入口模块,用于接收用户输入并根据用户输入确定所述执行模块所执行的数据库脚本。
3.如权利要求1所述的装置,其特征在于,所述处理模块包括:
分库处理子模块,用于根据所述配置文件中的数据源配置清单为所述目标数据库中的每一个创建数据库连接池和数据库级线程;
分表处理子模块,用于根据所述配置文件中的数据库表清单在各个所述目标数据库所对应的线程下,为对应的数据库表创建数据库表级线程,以及,根据所述配置文件中的篮子级线程个数的配置在各个数据库表级线程下,创建篮子级线程。
4.如权利要求3所述的装置,其特征在于,所述分库处理子模块还用于:
在所述执行模块执行完对当前数据库的数据库操作后,关闭当前数据库所对应的数据库连接池,回收当前数据库对应的数据库级线程。
5.如权利要求3或4所述的装置,其特征在于,所述分表处理子模块还用于:
在所述执行模块执行完对当前数据库表的任务之后,回收当前数据库表的线程;
在所述执行模块执行完对当前篮子的任务之后,回收当前篮子的线程。
6.如权利要求1所述的装置,其特征在于,所述处理模块还用于:
根据所述配置文件中的数据源配置清单确定所述目标数据库,根据预设的数据库脚本配置文件确定所述目标数据库对应的数据库脚本;或,
根据记录数据库操作失败信息的重跑日志确定所述目标数据库,根据所述数据库脚本配置文件和所述重跑日志确定所述目标数据库对应的数据库脚本;
其中,所述数据库脚本配置文件配置有所述目标数据库与所述数据库脚本的对应关系。
7.一种基于分库分表的数据库操作方法,其特征在于,所述方法包括:
加载配置文件和数据库脚本;
根据所述配置文件为目标数据库创建线程池和数据库连接池,其中,所述线程池包括数据库级线程池、数据库表级线程池和篮子级线程池;
通过所述线程池和数据库连接池,根据所述目标数据库对应的数据库脚本执行针对所述目标数据库的数据库操作;
其中,所述数据库脚本包括:数据库模式定义语言脚本、数据库操纵语言脚本、只分库不分表的数据库变更语句脚本和存储过程脚本;
根据所述目标数据库对应的数据库脚本执行针对所述目标数据库的数据库操作包括:根据当前目标数据库所对应的篮子号及对应的数据库脚本生成实际执行的脚本语句,并执行所述实际执行的脚本语句。
8.如权利要求7所述的方法,其特征在于,所述方法还包括:
接收用户输入并根据用户输入确定所述执行模块所执行的数据库脚本。
9.如权利要求7所述的方法,其特征在于,根据所述配置文件为目标数据库创建线程池和数据库连接池包括:
根据所述配置文件中的数据源配置清单为所述目标数据库中的每一个创建数据库连接池和数据库级线程;
根据所述配置文件中的数据库表清单在各个所述目标数据库所对应的线程下,为对应的数据库表创建数据库表级线程;
根据所述配置文件中的篮子级线程个数的配置在各个数据库表级线程下,创建篮子级线程。
10.如权利要求9所述的方法,其特征在于,所述方法还包括:
在执行完对当前数据库的数据库操作后,关闭当前数据库所对应的数据库连接池,回收当前数据库对应的数据库级线程。
11.如权利要求9或10所述的方法,其特征在于,所述方法还包括:
在执行完对当前数据库表的任务之后,回收当前数据库表的线程;
在执行完对当前篮子的任务之后,回收当前篮子的线程。
12.如权利要求7所述的方法,其特征在于,所述方法还包括:
根据所述配置文件中的数据源配置清单确定所述目标数据库,根据预设的数据库脚本配置文件确定所述目标数据库对应的数据库脚本;或,
根据记录数据库操作失败信息的重跑日志确定所述目标数据库,根据所述数据库脚本配置文件和所述重跑日志确定所述目标数据库对应的数据库脚本;
其中,所述数据库脚本配置文件配置有所述目标数据库与所述数据库脚本的对应关系。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610395908.6A CN106095878B (zh) | 2016-06-07 | 2016-06-07 | 基于分库分表的数据库操作装置及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610395908.6A CN106095878B (zh) | 2016-06-07 | 2016-06-07 | 基于分库分表的数据库操作装置及方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106095878A CN106095878A (zh) | 2016-11-09 |
CN106095878B true CN106095878B (zh) | 2019-11-19 |
Family
ID=57447782
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610395908.6A Active CN106095878B (zh) | 2016-06-07 | 2016-06-07 | 基于分库分表的数据库操作装置及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106095878B (zh) |
Families Citing this family (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106709064B (zh) * | 2017-01-17 | 2020-07-31 | Oppo广东移动通信有限公司 | 一种数据处理方法、装置及服务器 |
CN108984549A (zh) * | 2017-05-31 | 2018-12-11 | 北京京东尚科信息技术有限公司 | 一种基于动态配置数据库的分库分表数据抽取方法和装置 |
CN109144991B (zh) * | 2017-06-15 | 2021-09-14 | 北京京东尚科信息技术有限公司 | 动态分表的方法、装置、电子设备和计算机可存储介质 |
CN110019242A (zh) * | 2017-12-29 | 2019-07-16 | 北京京东尚科信息技术有限公司 | 用于数据表的处理方法、装置和*** |
CN109189468B (zh) * | 2018-08-06 | 2022-12-30 | 北京马上慧科技术有限公司 | 一种审批数据源配置化接入及xml映射配置化*** |
CN109308293B (zh) * | 2018-12-07 | 2021-09-24 | 广东中鹏热能科技有限公司 | 大并发数据库的分库分表方法 |
CN109739486A (zh) * | 2019-01-03 | 2019-05-10 | 深圳英飞拓科技股份有限公司 | 基于JdbcTemplate的多数据源数据库操作实现方法及装置 |
CN109977096A (zh) * | 2019-03-05 | 2019-07-05 | ***股份有限公司 | 一种数据库连接管理方法及装置 |
CN110321337A (zh) * | 2019-06-24 | 2019-10-11 | 南威互联网科技集团有限公司 | 一种实现数据库动态切换的方法及计算机可读存储介质 |
CN110570167B (zh) * | 2019-08-28 | 2023-04-07 | 珠海格力智能装备有限公司 | 工程项目文件管理方法和*** |
CN112000648B (zh) * | 2020-07-03 | 2022-11-15 | 苏宁云计算有限公司 | 数据清除方法、装置、计算机设备和存储介质 |
CN112069173A (zh) * | 2020-08-24 | 2020-12-11 | 北京首汽智行科技有限公司 | 一种数据动态分表方法 |
CN113553197B (zh) * | 2021-07-21 | 2022-06-03 | 用友汽车信息科技(上海)股份有限公司 | 数据处理方法、装置和可读存储介质 |
CN114328719A (zh) * | 2021-11-30 | 2022-04-12 | 唯品会(广州)软件有限公司 | 数据库语句同步方法、***、电子设备及计算机可读存储介质 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101408899A (zh) * | 2008-11-21 | 2009-04-15 | 北京中企开源信息技术有限公司 | 一种网站多数据源切换方法和装置 |
US7593980B2 (en) * | 2004-11-30 | 2009-09-22 | Cisco Technology, Inc. | Application server system and method |
US7647370B1 (en) * | 2003-10-24 | 2010-01-12 | Verizon Data Services Llc | Screen scraping interface |
CN102591970A (zh) * | 2011-12-31 | 2012-07-18 | 北京奇虎科技有限公司 | 一种分布式键-值查询方法和查询引擎*** |
CN103530427A (zh) * | 2013-11-04 | 2014-01-22 | 北京京东尚科信息技术有限公司 | 一种基于多数据库的动态切换方法和装置 |
CN103729373A (zh) * | 2012-10-15 | 2014-04-16 | 北京新媒传信科技有限公司 | 一种数据库代理方法和装置 |
CN103853718A (zh) * | 2012-11-28 | 2014-06-11 | 纽海信息技术(上海)有限公司 | 分片数据库访问方法及数据库*** |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6785848B1 (en) * | 2000-05-15 | 2004-08-31 | Microsoft Corporation | Method and system for categorizing failures of a program module |
-
2016
- 2016-06-07 CN CN201610395908.6A patent/CN106095878B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7647370B1 (en) * | 2003-10-24 | 2010-01-12 | Verizon Data Services Llc | Screen scraping interface |
US7593980B2 (en) * | 2004-11-30 | 2009-09-22 | Cisco Technology, Inc. | Application server system and method |
CN101408899A (zh) * | 2008-11-21 | 2009-04-15 | 北京中企开源信息技术有限公司 | 一种网站多数据源切换方法和装置 |
CN102591970A (zh) * | 2011-12-31 | 2012-07-18 | 北京奇虎科技有限公司 | 一种分布式键-值查询方法和查询引擎*** |
CN103729373A (zh) * | 2012-10-15 | 2014-04-16 | 北京新媒传信科技有限公司 | 一种数据库代理方法和装置 |
CN103853718A (zh) * | 2012-11-28 | 2014-06-11 | 纽海信息技术(上海)有限公司 | 分片数据库访问方法及数据库*** |
CN103530427A (zh) * | 2013-11-04 | 2014-01-22 | 北京京东尚科信息技术有限公司 | 一种基于多数据库的动态切换方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN106095878A (zh) | 2016-11-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106095878B (zh) | 基于分库分表的数据库操作装置及方法 | |
US11030166B2 (en) | Smart data transition to cloud | |
US10521427B2 (en) | Managing data queries | |
US11182691B1 (en) | Category-based sampling of machine learning data | |
US10339465B2 (en) | Optimized decision tree based models | |
CN102982075B (zh) | 支持访问异构数据源的***和方法 | |
US8200705B2 (en) | Method and apparatus for applying database partitioning in a multi-tenancy scenario | |
US8671084B2 (en) | Updating a data warehouse schema based on changes in an observation model | |
US8244780B1 (en) | Parameter oriented automated database command | |
CN110431545A (zh) | 针对结构化数据和非结构化数据执行查询 | |
US20120089612A1 (en) | Flexible fully integrated real-time document indexing | |
CN108197306A (zh) | Sql语句处理方法、装置、计算机设备和存储介质 | |
US20220138195A1 (en) | User defined functions for database query languages based on call-back functions | |
US20200250192A1 (en) | Processing queries associated with multiple file formats based on identified partition and data container objects | |
JP5276639B2 (ja) | 分散データベース管理装置および分散データベース管理プログラム | |
Damasio et al. | Guided automated learning for query workload re-optimization | |
CN117421302A (zh) | 一种数据处理方法及相关设备 | |
Gadepally et al. | Version 0.1 of the bigdawg polystore system | |
EP3657351A1 (en) | Smart data transition to cloud | |
US8280869B1 (en) | Sharing intermediate results | |
Gadepally et al. | BigDAWG version 0.1 | |
CN109033196A (zh) | 一种分布式数据调度***及方法 | |
Kalavri et al. | m2r2: A framework for results materialization and reuse in high-level dataflow systems for big data | |
CN111680036B (zh) | 一种基于图存储的配置管理数据库 | |
KR20130047431A (ko) | 대용량 배치처리를 위한 메모리 선적재 및 병렬처리 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |