CN108874837A - 数据库分库方法、装置、中间件及存储介质和电子设备 - Google Patents
数据库分库方法、装置、中间件及存储介质和电子设备 Download PDFInfo
- Publication number
- CN108874837A CN108874837A CN201710343229.9A CN201710343229A CN108874837A CN 108874837 A CN108874837 A CN 108874837A CN 201710343229 A CN201710343229 A CN 201710343229A CN 108874837 A CN108874837 A CN 108874837A
- Authority
- CN
- China
- Prior art keywords
- database
- preset
- operation request
- class
- partitioning
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 189
- 238000000638 solvent extraction Methods 0.000 claims description 32
- 238000004422 calculation algorithm Methods 0.000 claims description 10
- 230000005540 biological transmission Effects 0.000 claims description 7
- 238000002955 isolation Methods 0.000 claims description 7
- 230000002159 abnormal effect Effects 0.000 claims description 5
- 238000003780 insertion Methods 0.000 claims description 5
- 230000037431 insertion Effects 0.000 claims description 5
- 238000012546 transfer Methods 0.000 claims description 5
- 238000004590 computer program Methods 0.000 claims description 4
- 238000011161 development Methods 0.000 description 7
- 238000012545 processing Methods 0.000 description 7
- 238000012423 maintenance Methods 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 3
- 230000006870 function Effects 0.000 description 3
- 238000007726 management method Methods 0.000 description 3
- 238000012217 deletion Methods 0.000 description 2
- 230000037430 deletion Effects 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000009545 invasion Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000003252 repetitive effect Effects 0.000 description 1
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本公开是关于一种数据库分库方法、装置、中间件及存储介质的电子设备。该方法包括:接收一条数据库操作请求,解析所述数据库操作请求以调用预设数据库方法;在调用所述预设数据库方法时,使所述预设数据库方法访问预设代理类;所述预设代理类获取所述预设数据库方法的方法名称,并判断所述方法名称所属的方法类型;所述预设代理类根据判断得到的方法类型访问数据库以对所述数据库进行操作。本公开可以减小实现分库操作的代码侵入性,减少开发量以及降低开发复杂度。
Description
技术领域
本公开涉及计算机技术领域,尤其涉及一种数据库分库方法、数据库分库装置、包含所述数据库分库装置的数据库访问中间件以及实现所述数据库分库方法的计算机可读存储介质和电子设备。
背景技术
目前Java开源项目中,访问数据库的项目有很多,其中比较著名的也是目前使用比较多的分别是Hibernate和Mybatis项目。其中Hibernate由于比较重量级,所以一般多用在大型或者超大型项目中。而Mybatis由于比较轻量级,且由于开发方式简单高效等原因被大量的中小型项目所使用。甚至一些大型项目目前也使用Mybatis作为数据库访问组件。但是目前Mybatis并不支持分库操作,导致很多项目由于数据量大导致数据库压力过大,执行效率低下。
相关技术中,为了使Mybatis进行分库操作,多采用Spring技术动态数据源的方式。当一条数据进入系统时,首先通过逻辑计算该数据应使用的数据库,再通过ThreadLocal传递应使用的数据库的信息,执行数据库操作之前通过编码指定对应数据库进行操作,这样在一定程度上减小了数据库压力,执行效率有所提高。但是相关技术也存在一些问题,如代码侵入性强,开发复杂,不利于后期维护;当查询多条数据或通过求和sum、计数count等函数求值时需要遍历全部数据库再将查询结果相加,代码复杂度高,不利于初学者使用,后期维护成本高;传递数据库信息方式单一,仅通过ThreadLocal传递,多库切换时容易出错;使用数据库事务时(非分布式事务),无论使用声明式事务还是编程式事务都需要单独指定或编写每个数据库的事务,开发较为复杂。
因此,有必要提供一种新的技术方案改善上述方案中存在的一个或者多个问题。
需要说明的是,在上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。
发明内容
本公开的目的在于提供一种数据库分库方法、数据库分库装置、包含所述数据库分库装置的数据库访问中间件以及实现所述数据库分库方法的计算机可读存储介质和电子设备,进而至少在一定程度上克服由于相关技术的限制和缺陷而导致的一个或者多个问题。
本公开的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本公开的实践而习得。
根据本公开实施例的第一方面,提供一种数据库分库方法,所述方法包括:
接收一条数据库操作请求,解析所述数据库操作请求以调用预设数据库方法;
在调用所述预设数据库方法时,使所述预设数据库方法访问预设代理类;
所述预设代理类获取所述预设数据库方法的方法名称,并判断所述方法名称所属的方法类型;
所述预设代理类根据判断得到的方法类型访问数据库以对所述数据库进行操作。
本公开的一种示例性实施例中,在所述预设代理类获取所述预设数据库方法的方法名称之前,所述方法还包括:
所述预设代理类判断在调用所述预设数据库方法时是否传递了分库主键;
若是,则根据所述分库主键计算所述数据库操作请求所要访问的目标数据库;
所述预设代理类直接访问所述目标数据库以对所述目标数据库进行操作;
若否,则所述预设代理类获取所述预设数据库方法的方法名称。
在本公开的一种示例性实施例中,所述分库主键的传递方式包括以下任意一个:在HashMap中指出;通过继承分库主键抽象类中的shardingKey赋值;以及在所述预设代理类的XML配置文件中配置所述预设数据库方法对应的分库主键的属性名称。
本公开的一种示例性实施例中,所述根据所述分库主键计算所述数据库操作请求所要访问的目标数据库包括:
由预设调度类根据所述分库主键计算所述数据库操作请求所要访问的目标数据库。
本公开的一种示例性实施例中,所述由预设调度类根据所述分库主键计算所述数据库操作请求所要访问的目标数据库包括:
所述预设调度类根据所述分库主键并结合哈希算法或者取余算法计算所述数据库操作请求所要访问的目标数据库。
本公开的一种示例性实施例中,所述预设代理类根据判断得到的方法类型访问数据库以对所述数据库进行操作包括:
根据所述方法类型对应的操作请求默认对全部数据库进行操作;或者,
判断所述方法类型对应的操作请求是否包括分库主键;
若是,则根据所述分库主键访问对应的数据库以对该对应的数据库进行操作。
本公开的一种示例性实施例中,所述方法类型对应的操作请求包括查询、更新、删除和插入;所述根据所述方法类型对应的操作请求默认对全部数据库进行操作包括:
当所述操作请求为更新或者删除时,所述预设代理类并发扫描全部数据库,以更新或者删除全部数据库中符合预设条件的数据;
当所述操作请求为查询时,所述预设代理类并发扫描全部数据库查询数据并将查询结果返回;
当所述操作请求为插入时,所述预设代理类抛出异常信息。
本公开的一种示例性实施例中,所述预设代理类并发扫描全部数据库查询数据并将查询结果返回包括:
根据预设传递参数对查询到的数据进行排序、求最大值、求最小值或者求和处理后返回对应的查询结果。
本公开的一种示例性实施例中,所述方法还包括:
在所述预设代理类获取所述预设数据库方法的方法名称之前,设置自定义声明式事务标签;
从所述自定义声明式事务标签中获取预设的事务隔离级别,以在执行事务操作时记录事务执行结果。
本公开的一种示例性实施例中,所述预设代理类通过Mybatis所属的SqlSessionTemplate实现。
根据本公开实施例的第二方面,提供一种数据库分库装置,所述装置包括:
指令接收模块,用于接收一条数据库操作请求,根据所述数据库操作请求调用预设数据库方法;
方法使能模块,用于在调用所述预设数据库方法时,使所述预设数据库方法访问预设代理类;
第一代理模块,用于使所述预设代理类获取所述预设数据库方法的方法名称,并判断所述方法名称所属的方法类型;
第二代理模块,用于使所述预设代理类根据判断得到的方法类型访问数据库以对所述数据库进行操作。
根据本公开实施例的第三方面,提供一种数据库访问中间件,包括上述实施例中所述数据库分库装置。
根据本公开实施例的第四方面,提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述任一实施例所述数据库分库方法的步骤。
根据本公开实施例的第五方面,提供一种电子设备,包括:
处理器;以及存储器,用于存储所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行上述任一实施例所述数据库分库方法的步骤。
本公开的实施例提供的技术方案可以包括以下有益效果:
本公开的一种实施例中,通过上述数据库分库方法及装置,通过代理访问方式实现动态分库,传递数据库信息时可以通过数据库操作请求(如查询请求)对应的数据库方法的方法名称所属的方法类型(如查询类型);这样,一方面,通过代理访问方式实现动态分库,代码侵入性小,可以少改甚至不改变原有代码,代码复杂度低,减少了开发量,从而节省成本;另一方面,根据方法类型或者分库主键可以访问数据库,使得开发人员不必关心多个数据库,开发人员也不需要对分库方式进行了解,只需要在分库中指定如查询类型,即可自动对数据库操作进行后续数据处理,减少了开发复杂度,从而可以降低后期维护成本。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示意性示出本公开示例性实施例中数据库分库方法流程图;
图2示意性示出本公开示例性实施例一应用场景中的数据库分库方法流程图;
图3示意性示出本公开示例性实施例中另一数据库分库方法流程图;
图4示意性示出本公开示例性实施例又一数据库分库方法流程图;
图5示意性示出本公开示例性实施例再一数据库分库方法流程图;
图6示意性示出本公开示例性实施例中数据库分库装置示意图;
图7示意性示出本公开示例性实施例中计算机可读存储介质示意图;
图8示意性示出本公开示例性实施例中另一数据库分库装置示意图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本公开将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。
此外,附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
本示例实施方式中首先提供了一种数据库分库方法,本实施例中该方法的执行主体是数据库访问中间件,例如基于Mybatis的数据库访问中间件。参考图1中所示,该方法可以包括以下步骤:
步骤S101:接收一条数据库操作请求,解析所述数据库操作请求以调用预设数据库方法。
步骤S102:在调用所述预设数据库方法时,使所述预设数据库方法访问预设代理类。
步骤S103:所述预设代理类获取所述预设数据库方法的方法名称,并判断所述方法名称所属的方法类型。
步骤S104:所述预设代理类根据判断得到的方法类型访问数据库以对所述数据库进行操作。
通过上述数据库分库方法,一方面,通过代理访问方式实现动态分库,代码侵入性小,可以少改甚至不改变原有代码,代码复杂度低,减少开发量,从而节省成本;另一方面,根据方法类型可以访问数据库,使得开发人员不必关心多个数据库,开发人员也不需要对分库方式进行了解,只需要在分库中指定如查询类型,即可自动对数据库操作进行后续数据处理,减少了开发复杂度,从而可以降低后期维护成本。
下面,将参考图1至图5对本示例实施方式中的上述方法的各个步骤进行更详细的说明。
在步骤S101中,接收一条数据库操作请求,解析所述数据库操作请求以调用预设数据库方法。
本示例实施方式中,所述数据库操作请求可以是数据查询、数据更新、数据删除和数据插入中的任意一个操作请求,如SQL语句请求。相应的,每个操作请求可以对应一个数据库方法,该数据库方法可以执行如SQL解析、SQL路由和SQL执行等操作。
在步骤S102中,在调用所述预设数据库方法时,使所述预设数据库方法访问预设代理类。
本示例实施方式中,所述预设代理类可以通过Mybatis所属的SqlSessionTemplate实现。也就是说,Mybatis可以调用数据库访问模板SqlSessionTemplate通过代理的方式实现动态分库,当然Mybatis也可以调用底层Ibatis通过代理的方式对数据库进行分库,并不限于此。所有数据库方法调用时都会访问这个代理类,在代理类中通过逻辑判断与传参参数相结合的方式,自动进行一些分库计算,下文会具体说明分库计算。
在步骤S103中,所述预设代理类获取所述预设数据库方法的方法名称,并判断所述方法名称所属的方法类型。
参考图2中所示,本示例实施方式中,所述预设数据库方法的方法名称可以包括SelectOne、SelectList、Insert、Update和Delete等。其中,SelectOne表示从数据库中查询一条数据,SelectList表示从数据库中查询多条数据。所述方法类型可以对应包括查询、更新、删除和插入等。这样,通过数据库方法的方法名称如SelectOne、SelectList、Insert、Update和Delete等即可以判断该数据库方法的方法名称的类型。
在步骤S104中,所述预设代理类根据判断得到的方法类型访问数据库以对所述数据库进行操作。
本示例实施方式中,步骤S104中所述预设代理类根据判断得到的方法类型访问数据库以对所述数据库进行操作可以包括但不限于示例性的两种方式。第一种方式是针对批量操作的情况,不需要分库主键,根据所述方法类型对应的操作请求默认对全部数据库进行操作。第二种方式是根据分库主键访问对应数据库,具体为:判断所述方法类型对应的操作请求是否包括分库主键;若是,则根据所述分库主键访问对应的数据库以对该对应的数据库进行操作。下面以第一种方式为例进行具体说明。
参考图2中所示,在一种示例性实施例中,所述方法类型对应的操作请求包括查询、更新、删除和插入。相应的,所述根据所述方法类型对应的操作请求默认对全部数据库进行操作可以包括:
当所述操作请求为更新或者删除时,所述预设代理类并发扫描全部数据库,以更新或者删除全部数据库中符合预设条件的数据。示例性的,所述预设代理类可以采用多线程执行并发扫描全部数据库的操作,这样可以提高数据库操作效率,减少系统等待时间。
当所述操作请求为查询时,所述预设代理类并发扫描全部数据库查询数据并将查询结果返回。示例性的,所述预设代理类可以采用多线程执行并发扫描全部数据库的操作,这样可以提高数据库操作效率,减少系统等待时间。其中,所述预设代理类并发扫描全部数据库查询数据并将查询结果返回可以包括:根据预设传递参数对查询到的数据进行排序、求最大值、求最小值或者求和处理后返回对应的查询结果。
举例来说,当查询多条数据(对应方法名称为SelectList)时,所述预设代理类并发扫描全部数据库,并将查询结果组合到一起,然后判断相应的查询数据库方法调用时是否传递预设参数Comparator,若是则根据Comparator设定的排序方式为查询结果排序并返回排序后的查询结果;若否则直接返回查询结果。其中Comparator是Java提供的为数据对象进行排序的接口。
当查询一条数据(对应方法名称为SelectOne)时,所述预设代理类首先判断是否查询返回值为对象或者字符串,若是则抛出如缺少分库主键的异常信息,结束本次查询;若不是则根据传递参数或者配置获取该查询是否为查询sum或者count,若是查询sum或者count,则并发扫描全部数据库,并将查询结果相加返回相加后的最终结果,结束本次查询;若不是查询sum或者count,则还要判断该查询是否为查询最大值max或者最小值min,若是则并发扫描全部数据库将查询结果排序,并返回对应的最大值或者最小值;若不是则抛出如缺少分库主键的异常信息,结束本次查询。
当所述操作请求为插入时,所述预设代理类可以抛出异常信息,如缺少分库主键的异常信息。
参考图2和图3中所示,在一种示例性实施例中,在所述预设代理类获取所述预设数据库方法的方法名称之前,所述方法还可以包括以下步骤:
步骤S301:所述预设代理类判断在调用所述预设数据库方法时是否传递了分库主键。
其中,所述分库主键的传递方式包括以下任意一个:在HashMap中指出;通过继承分库主键抽象类中的shardingKey赋值;以及在所述预设代理类的XML配置文件中配置所述预设数据库方法对应的分库主键的属性名称。本实施例中分库主键传递方式丰富,可以适合多种场景的应用。
步骤S302:若是,则根据所述分库主键计算所述数据库操作请求所要访问的目标数据库;若否,则所述预设代理类获取所述预设数据库方法的方法名称。
在一种示例性实施例中,所述根据所述分库主键计算所述数据库操作请求所要访问的目标数据库可以包括:由预设调度类根据所述分库主键计算所述数据库操作请求所要访问的目标数据库。
示例性的,所述分库主键是用来获取分库名称进而获取要访问的目标数据库,而方法名称是用来区分不同的数据库操作类型,好进一步封装数据库操作用的。
所述预设调度类可以是开发人员写好的一个调度类,所述预设调度类根据所述分库主键并结合Hash哈希算法或者取余算法计算所述数据库操作请求所要访问的目标数据库,也即调度类通过Hash或者取余等算法计算应该使用的数据源,可以预先将多个数据源注入该调度类中。所述预设代理类可以依赖于该调度类传递的数据源。其中具体的算法可参考现有技术,不再赘述。当然本实施例中并不限于此,也可以采用其他方式计算所述数据库操作请求所要访问的目标数据库。
步骤S303:所述预设代理类直接访问所述目标数据库以对所述目标数据库进行操作。通过分库主键获取分库名称进而得到了目标数据库后,可以直接访问所述目标数据库以对所述目标数据库进行操作,接收返回的操作结果,如查询数据而返回的查询结果。
本示例性实施例中,开发人员不需要对分库方式进行了解,只需要在分库中指定如查询类型或者分库主键,即可自动对数据库操作进行后续数据处理,减少了开发复杂度。
参考图4~5中所示,在进行多库操作时,即对多个数据库进行操作时,需要进行事务管理,本实施例中支持多数据库事务。在一种示例性实施例中,所述方法还可以包括以下步骤:
步骤S401:在所述预设代理类获取所述预设数据库方法的方法名称之前,设置自定义声明式事务标签。
示例性的,声明式事务是建立在面向切面编程AOP(Aspect OrientedProgramming)之上的,本质是对数据库方法(如查询方法)前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。本实施例中的所述自定义声明式事务标签用来代替Spring事务标签进行使用。
步骤S402:从所述自定义声明式事务标签中获取预设的事务隔离级别,以在执行事务操作时记录事务执行结果。
本示例性实施例中,该自定义声明式事务标签默认只需配置事务隔离级别(隔离级别与Spring事务隔离级别相等)。另外该自定义声明式事务标签内对每个数据库的事务执行结果进行记录。用户可以指定单独的事务日志文件,也可以选择使用默认事务文件名字。如图5中所示,日志中对事务执行失败的分库主键会做详细的日志记录,例如执行失败时间、分库之间值、执行方法名称、传递参数信息、执行的SQL语句以及错误的堆栈信息等,方便用户后期解决数据异常的问题。
需要说明的是,尽管在附图中以特定顺序描述了本公开中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。另外,也易于理解的是,这些步骤可以是例如在多个模块/进程/线程中同步或异步执行。
进一步的,本示例实施方式中,还提供了一种数据库分库装置。参考图6中所示,装置100可以包括指令接收模块101、方法使能模块102、第一代理模块103和第二代理模块104。其中:
所述指令接收模块101,用于接收一条数据库操作请求,根据所述数据库操作请求调用预设数据库方法。
所述方法使能模块102,用于在调用所述预设数据库方法时,使所述预设数据库方法访问预设代理类。
所述第一代理模块103,用于使所述预设代理类获取所述预设数据库方法的方法名称,并判断所述方法名称所属的方法类型。
所述第二代理模块104,用于使所述预设代理类根据判断得到的方法类型访问数据库以对所述数据库进行操作。
在本公开的一种示例性实施例中,所述装置100还可以包括第三代理模块(图未示)。在所述预设代理类获取所述预设数据库方法的方法名称之前,所述第三代理模块可以用于使所述预设代理类判断在调用所述预设数据库方法时是否传递了分库主键;若是,则根据所述分库主键计算所述数据库操作请求所要访问的目标数据库;所述预设代理类直接访问所述目标数据库以对所述目标数据库进行操作;若否,则所述预设代理类获取所述预设数据库方法的方法名称。
在本公开的一种示例性实施例中,所述分库主键的传递方式包括以下任意一个:在HashMap中指出;通过继承分库主键抽象类中的shardingKey赋值;以及在所述预设代理类的XML配置文件中配置所述预设数据库方法对应的分库主键的属性名称。
在本公开的一种示例性实施例中,所述根据所述分库主键计算所述数据库操作请求所要访问的目标数据库包括:由预设调度类根据所述分库主键计算所述数据库操作请求所要访问的目标数据库。
在本公开的一种示例性实施例中,所述由预设调度类根据所述分库主键计算所述数据库操作请求所要访问的目标数据库包括:所述预设调度类根据所述分库主键并结合哈希算法或者取余算法计算所述数据库操作请求所要访问的目标数据库。
在本公开的一种示例性实施例中,所述第二代理模块104在使所述预设代理类根据判断得到的方法类型访问数据库以对所述数据库进行操作可以包括:根据所述方法类型对应的操作请求默认对全部数据库进行操作;或者,判断所述方法类型对应的操作请求是否包括分库主键;若是,则根据所述分库主键访问对应的数据库以对该对应的数据库进行操作。
在本公开的一种示例性实施例中,所述方法类型对应的操作请求包括查询、更新、删除和插入。所述第二代理模块104可以用于:当所述操作请求为更新或者删除时,所述预设代理类并发扫描全部数据库,以更新或者删除全部数据库中符合预设条件的数据;当所述操作请求为查询时,所述预设代理类并发扫描全部数据库查询数据并将查询结果返回;当所述操作请求为插入时,所述预设代理类抛出异常信息。
在本公开的一种示例性实施例中,所述第二代理模块104可以用于:所述预设代理类并发扫描全部数据库查询数据并将查询结果返回时,根据预设传递参数对查询到的数据进行排序、求最大值、求最小值或者求和处理后返回对应的查询结果。
本公开的一种示例性实施例中,所述装置还可以包括事务管理模块(图未时),其可以用于:在所述预设代理类获取所述预设数据库方法的方法名称之前,设置自定义声明式事务标签;从所述自定义声明式事务标签中获取预设的事务隔离级别,以在执行事务操作时记录事务执行结果。
在本公开的一种示例性实施例中,以上所述预设代理类可以通过Mybatis所属的SqlSessionTemplate实现。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。作为模块或单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现木公开方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
本示例实施方式中,还提供一种数据库访问中间件,该数据库访问中间件可以包括上述任一实施例中所述数据库分库装置。关于该数据库分库装置可以参考前述实施例中详细描述,此处不再赘述。示例性的,所述数据库访问中间件可以是基于Mybatis的数据库访问中间件。
参考图7中所示,本示例实施方式中,还提供一种计算机可读存储介质300,其上存储有计算机程序,该程序被处理器执行时实现上述任一实施例所述数据库分库方法的步骤。所述计算机可读存储介质300可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等,本示例实施方式中对此不作限制。
最后,本示例实施方式中,还提供一种电子设备,包括处理器以及存储器(图未示)。其中,所述存储器用于存储所述处理器的可执行指令。所述处理器配置为经由执行所述可执行指令来执行上述任一实施例所述数据库分库方法的步骤。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、触控终端、或者网络设备等)执行根据本公开实施方式的方法。
图8示出根据本公开示例实施方式中一种数据库分库装置400的示意图。例如,装置400可以被提供为一服务器。装置400包括处理组件422,其进一步包括一个或多个处理器,以及由存储器432所代表的存储器资源,用于存储可由处理组件422的执行的指令,例如应用程序。存储器432中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件422被配置为执行指令,以执行上述方法。
装置400还可以包括一个电源组件426被配置为执行装置400的电源管理,一个有线或无线网络接口450被配置为将装置400连接到网络,和一个输入输出(I/O)接口458。装置400可以操作基于存储在存储器432的操作系统,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM或类似。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由所附的权利要求指出。
Claims (14)
1.一种数据库分库方法,其特征在于,所述方法包括:
接收一条数据库操作请求,解析所述数据库操作请求以调用预设数据库方法;
在调用所述预设数据库方法时,使所述预设数据库方法访问预设代理类;
所述预设代理类获取所述预设数据库方法的方法名称,并判断所述方法名称所属的方法类型;
所述预设代理类根据判断得到的方法类型访问数据库以对所述数据库进行操作。
2.根据权利要求1所述数据库分库方法,其特征在于,在所述预设代理类获取所述预设数据库方法的方法名称之前,所述方法还包括:
所述预设代理类判断在调用所述预设数据库方法时是否传递了分库主键;
若是,则根据所述分库主键计算所述数据库操作请求所要访问的目标数据库;
所述预设代理类直接访问所述目标数据库以对所述目标数据库进行操作;
若否,则所述预设代理类获取所述预设数据库方法的方法名称。
3.根据权利要求2所述数据库分库方法,其特征在于,所述分库主键的传递方式包括以下任意一个:在HashMap中指出;通过继承分库主键抽象类中的shardingKey赋值;以及在所述预设代理类的XML配置文件中配置所述预设数据库方法对应的分库主键的属性名称。
4.根据权利要求2所述数据库分库方法,其特征在于,所述根据所述分库主键计算所述数据库操作请求所要访问的目标数据库包括:
由预设调度类根据所述分库主键计算所述数据库操作请求所要访问的目标数据库。
5.根据权利要求4所述数据库分库方法,其特征在于,所述由预设调度类根据所述分库主键计算所述数据库操作请求所要访问的目标数据库包括:
所述预设调度类根据所述分库主键并结合哈希算法或者取余算法计算所述数据库操作请求所要访问的目标数据库。
6.根据权利要求1~5任一项所述数据库分库方法,其特征在于,所述预设代理类根据判断得到的方法类型访问数据库以对所述数据库进行操作包括:
根据所述方法类型对应的操作请求默认对全部数据库进行操作;或者,
判断所述方法类型对应的操作请求是否包括分库主键;
若是,则根据所述分库主键访问对应的数据库以对该对应的数据库进行操作。
7.根据权利要求6所述数据库分库方法,其特征在于,所述方法类型对应的操作请求包括查询、更新、删除和插入;
所述根据所述方法类型对应的操作请求默认对全部数据库进行操作包括:
当所述操作请求为更新或者删除时,所述预设代理类并发扫描全部数据库,以更新或者删除全部数据库中符合预设条件的数据;
当所述操作请求为查询时,所述预设代理类并发扫描全部数据库查询数据并将查询结果返回;
当所述操作请求为插入时,所述预设代理类抛出异常信息。
8.根据权利要求7所述数据库分库方法,其特征在于,所述预设代理类并发扫描全部数据库查询数据并将查询结果返回包括:
根据预设传递参数对查询到的数据进行排序、求最大值、求最小值或者求和处理后返回对应的查询结果。
9.根据权利要求7所述数据库分库方法,其特征在于,所述方法还包括:
在所述预设代理类获取所述预设数据库方法的方法名称之前,设置自定义声明式事务标签;
从所述自定义声明式事务标签中获取预设的事务隔离级别,以在执行事务操作时记录事务执行结果。
10.根据权利要求7所述数据库分库方法,其特征在于,所述预设代理类通过Mybatis所属的SqlSessionTemplate实现。
11.一种数据库分库装置,其特征在于,所述装置包括:
指令接收模块,用于接收一数据库操作请求,根据所述数据库操作请求调用预设数据库方法;
方法使能模块,用于在调用所述预设数据库方法时,使所述预设数据库方法访问预设代理类;
第一代理模块,用于使所述预设代理类获取所述预设数据库方法的方法名称,并判断所述方法名称所属的方法类型;以及
第二代理模块,用于使所述预设代理类根据判断得到的方法类型访问数据库以对所述数据库进行操作。
12.一种数据库访问中间件,其特征在于,包括权利要求11所述数据库分库装置。
13.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1~10任一项所述数据库分库方法的步骤。
14.一种电子设备,其特征在于,包括:
处理器;以及存储器,用于存储所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行权利要求1~10任一项所述数据库分库方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710343229.9A CN108874837B (zh) | 2017-05-16 | 2017-05-16 | 数据库分库方法、装置、中间件及存储介质和电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710343229.9A CN108874837B (zh) | 2017-05-16 | 2017-05-16 | 数据库分库方法、装置、中间件及存储介质和电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108874837A true CN108874837A (zh) | 2018-11-23 |
CN108874837B CN108874837B (zh) | 2021-09-03 |
Family
ID=64320721
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710343229.9A Active CN108874837B (zh) | 2017-05-16 | 2017-05-16 | 数据库分库方法、装置、中间件及存储介质和电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108874837B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110717074A (zh) * | 2019-09-26 | 2020-01-21 | 上海依图网络科技有限公司 | 对象持久化方法、装置、介质和系统 |
CN112380276A (zh) * | 2021-01-15 | 2021-02-19 | 四川新网银行股份有限公司 | 一种分布式系统分库分表后非分片键字段查询数据的方法 |
CN112685402A (zh) * | 2019-10-17 | 2021-04-20 | 拉扎斯网络科技(上海)有限公司 | 数据存储及查询方法、装置、电子设备及存储介质 |
WO2021078176A1 (zh) * | 2019-10-25 | 2021-04-29 | 中兴通讯股份有限公司 | 存储过程的运行方法、装置、数据库系统及存储介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030135505A1 (en) * | 2002-01-15 | 2003-07-17 | International Business Machines Corporation | Edge deployed database proxy driver |
KR20130101349A (ko) * | 2012-03-05 | 2013-09-13 | 네이버비즈니스플랫폼 주식회사 | 데이터베이스 미들웨어를 이용한 데이터 관리 시스템 및 방법 |
CN105138676A (zh) * | 2015-09-08 | 2015-12-09 | 浙江维融电子科技股份有限公司 | 基于高级语言并发聚合计算的分库分表merge查询方法 |
CN105426396A (zh) * | 2015-10-28 | 2016-03-23 | 深圳市万姓宗祠网络科技股份有限公司 | 一种基于路由算法的数据库分片方法、系统和中间件系统 |
CN105933408A (zh) * | 2016-04-20 | 2016-09-07 | 中国银联股份有限公司 | 一种Redis通用中间件的实现方法及装置 |
CN106055587A (zh) * | 2016-05-21 | 2016-10-26 | 乐视控股(北京)有限公司 | 一种分库数据库系统及其路由方法 |
-
2017
- 2017-05-16 CN CN201710343229.9A patent/CN108874837B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030135505A1 (en) * | 2002-01-15 | 2003-07-17 | International Business Machines Corporation | Edge deployed database proxy driver |
KR20130101349A (ko) * | 2012-03-05 | 2013-09-13 | 네이버비즈니스플랫폼 주식회사 | 데이터베이스 미들웨어를 이용한 데이터 관리 시스템 및 방법 |
CN105138676A (zh) * | 2015-09-08 | 2015-12-09 | 浙江维融电子科技股份有限公司 | 基于高级语言并发聚合计算的分库分表merge查询方法 |
CN105426396A (zh) * | 2015-10-28 | 2016-03-23 | 深圳市万姓宗祠网络科技股份有限公司 | 一种基于路由算法的数据库分片方法、系统和中间件系统 |
CN105933408A (zh) * | 2016-04-20 | 2016-09-07 | 中国银联股份有限公司 | 一种Redis通用中间件的实现方法及装置 |
CN106055587A (zh) * | 2016-05-21 | 2016-10-26 | 乐视控股(北京)有限公司 | 一种分库数据库系统及其路由方法 |
Non-Patent Citations (1)
Title |
---|
漆绍洋: "基于mysql的分布式访问中间件中sql处理模块的设计与实现", 《中国优秀硕士学位论文全文数据库信息科技辑》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110717074A (zh) * | 2019-09-26 | 2020-01-21 | 上海依图网络科技有限公司 | 对象持久化方法、装置、介质和系统 |
CN110717074B (zh) * | 2019-09-26 | 2023-04-07 | 上海依图网络科技有限公司 | 对象持久化方法、装置、介质和系统 |
CN112685402A (zh) * | 2019-10-17 | 2021-04-20 | 拉扎斯网络科技(上海)有限公司 | 数据存储及查询方法、装置、电子设备及存储介质 |
CN112685402B (zh) * | 2019-10-17 | 2023-03-24 | 拉扎斯网络科技(上海)有限公司 | 数据存储及查询方法、装置、电子设备及存储介质 |
WO2021078176A1 (zh) * | 2019-10-25 | 2021-04-29 | 中兴通讯股份有限公司 | 存储过程的运行方法、装置、数据库系统及存储介质 |
CN112380276A (zh) * | 2021-01-15 | 2021-02-19 | 四川新网银行股份有限公司 | 一种分布式系统分库分表后非分片键字段查询数据的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN108874837B (zh) | 2021-09-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20200301917A1 (en) | Data protection method and device and storage medium | |
CN108874837B (zh) | 数据库分库方法、装置、中间件及存储介质和电子设备 | |
US20160188391A1 (en) | Sophisticated run-time system for graph processing | |
CN107038222B (zh) | 数据库缓存实现方法及其系统 | |
EP2797014A1 (en) | Database update execution according to power management schemes | |
WO2018035799A1 (zh) | 数据查询方法、应用和数据库服务器、中间件及系统 | |
US7788275B2 (en) | Customization of relationship traversal | |
CN110389765A (zh) | 一种参数校验方法和参数校验系统 | |
US10684873B2 (en) | Efficient data decoding using runtime specialization | |
US20200117433A1 (en) | Code optimization conversations for connected managed runtime environments | |
González-Aparicio et al. | A new model for testing CRUD operations in a NoSQL database | |
US10521430B1 (en) | Dynamic selection of query execution operators | |
WO2012024435A2 (en) | System and method for execution of high performance computing applications | |
CN112115150A (zh) | 嵌入式内存数据库的数据管理方法、终端设备及介质 | |
US20180096010A1 (en) | Flexible in-memory column store placement | |
US8930960B2 (en) | Methods and systems for object interpretation within a shared object space | |
Brady et al. | SmartGridRPC: The new RPC model for high performance Grid computing | |
CN113626001B (zh) | 一种基于脚本的api动态编排方法及装置 | |
CN115374083A (zh) | 数据源的切换方法、装置、电子设备及存储介质 | |
US11341022B2 (en) | Runtime performance introspection | |
CN114138777A (zh) | 一种分库分表方法、装置、电子设备及存储介质 | |
CN113448985A (zh) | 一种api接口生成方法、调用方法、装置及电子设备 | |
CN112650502A (zh) | 批处理任务处理方法、装置、计算机设备和存储介质 | |
KR20170130911A (ko) | Dds-dbms 연동 도구의 실시간 변경 데이터 발간 서비스 수행 방법 | |
US11947931B2 (en) | Generic factory class |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |