一种访问数据库的方法和装置制造方法

文档序号:6489706阅读:122来源:国知局
一种访问数据库的方法和装置制造方法【专利摘要】本申请提供了一种访问数据库的方法和装置,其中的方法具体包括:预置分库分表标识的生成规则;接收数据库写访问请求;数据库写访问请求中携带有待写入数据;依据所述数据库写访问请求,动态获取当前可用的数据库及该数据库下的数据表信息,并得到相应的库索引和表索引;依据所述分库分表标识的生成规则,对所述库索引和表索引连同静态位进行拼装,得到与所述数据库写访问请求相应的分库分表标识;依据所述分库分表标识的生成规则,对与所述数据库写访问请求相应的分库分表标识中的库索引和表索引进行路由;将所述待写入数据写入至与路由结果相应的数据库下的数据表中。本申请能够提高数据库维护的便利性,以及,能够节省数据库系统的物理资源。【专利说明】一种访问数据库的方法和装置【
技术领域
】[0001]本申请涉及数据库【
技术领域
】,特别是涉及一种访问数据库的方法和装置。【
背景技术
】[0002]目前随着社会的发展,应用系统中大量的数据需要存储起来,对存储的数据,根据不同用户的需求应用一定的数据访问方法进行处理,所述数据库是适应这种需求的一种技术,简单的说,数据库是数据以一种能够持久保存,并且可以被操作的方式来保存的数据集口ο[0003]当需要存储的数据量到达一定程度(如:上亿级别),使用单台数据库进行数据的存储管理,会出现容量瓶颈、性能瓶颈等问题,影响到应用系统处理能力提升,从而影响业务更加快速的发展;同时,单台数据库也是整个应用系统中的单点,一旦出现故障,会直接影响到业务的可用性。[0004]分库分表是数据库存储、管理海量数据的一种方法,分库是指将海量数据由一个数据库存储管理拆分为多个数据库存储管理;分表是指将海量数据由一个数据表存储管理拆分为多个数据表存储管理。[0005]采用分库分表可以很好的解决上述单库存在的问题,现有技术中分库分表的方法如下:[0006]通过一个参数,例如使用用户ID来确定分库分表规则,以用户ID的倒数第二位确定数据库编号,以最后一位确定数据库中的数据表编号。例如:分库分表规则为用户ID倒数第二位为1、3、5、7、9进A库,0、2、4、6、8进B库,最后一位0-9分别对应库中不同的表,这样对于用户ID为123456789时,将数据写入B库第9个表。[0007]使用现有技术中分库分表方法,当已有的数据库规模不能满足日益增长的数据量,需要通过新增数据库的方式来满足需求时,分库分表规则也需要进行变更。对于目前大多数应用系统来说,由于使用了固定的参数进行分库分表,需要同步地将旧数据库中对应数据迁移到新增的数据库中才能正常使用。[0008]例如:分库分表规则为用户ID倒数第二位,1、3、5、7、9进A库;0、2、4、6、8进B库;当新增一个C库来管理数据时,需要将分库分表规则改为1、3、5进A库,0、2、4进B库,6、7、8、9进C库。在分库分表规则修改后,必须将原有A库、B库中用户ID倒数第二位为6、7、8、9的数据全部迁移到C库,否则使用新的分库分表规则将会导致旧数据库中某些数据无法读取;而所述数据迁移无疑增加了数据库维护的难度,且消耗了大量的CPU资源或内存资源。[0009]总之,需要本领域技术人员迫切解决的一个技术问题就是:如何能够提高数据库维护的便利性,以及,能够节省数据库系统的物理资源。【
发明内容】[0010]本申请所要解决的技术问题是提供一种访问数据库的方法和装置,能够提高数据库维护的便利性,以及,能够节省数据库系统的物理资源。[0011]为了解决上述问题,本申请公开了一种访问数据库的方法,包括:[0012]预置分库分表标识的生成规则;[0013]接收数据库写访问请求;所述数据库写访问请求中携带有待写入数据;[0014]依据所述数据库写访问请求,动态获取当前可用的数据库及该数据库下的数据表信息,并得到相应的库索引和表索引;[0015]依据所述分库分表标识的生成规则,对所述库索引和表索引连同静态位进行拼装,得到与所述数据库写访问请求相应的分库分表标识;[0016]依据所述分库分表标识的生成规则,对与所述数据库写访问请求相应的分库分表标识中的库索引和表索引进行路由;[0017]将所述待写入数据写入至与路由结果相应的数据库下的数据表中。[0018]优选的,所述依据所述数据库写访问请求,动态获取当前可用的数据库及该数据库下的数据表信息的步骤,包括:[0019]在接收到所述数据库写访问请求时,从应用系统连接的多个数据库中随机获取一个当前可用的数据库,以及,从该数据库下的多个数据表中随机获取一个数据表。[0020]优选的,通过如下步骤检测数据库是否可用:[0021]在接收到所述数据库写访问请求时,通过与数据库通讯检测数据库是否可用;或者,[0022]在接收到所述数据库写访问请求时,依据数据库的可用标志判断数据库是否可用;其中,所述可用标志由数据库管理员依据数据库的状态确定,故障数据库对应的可用标志为不可用,正常运行数据库对应的可用标志为可用。[0023]优选的,所述静态位至少包括如下位中的一种或多种:日期、序号和ID。[0024]优选的,所述依据所述分库分表标识的生成规则,对所述库索引和表索引连同静态位进行拼装的步骤,包括:[0025]依据所述分库分表标识的生成规则中定义的静态位、库索引和表索引在分库分表标识中的位置,对所述库索引和表索引连同静态位进行拼装,得到与所述数据库写访问请求相应的分库分表标识。[0026]优选的,所述依据所述分库分表标识的生成规则,对与所述数据库写访问请求相应的分库分表标识中的库索引和表索引进行路由的步骤,包括:[0027]依据所述分库分表标识的生成规则中定义的静态位、库索引和表索引在分库分表标识中的位置,解析出与所述数据库写访问请求相应的分库分表标识中的库索引和表索弓I;[0028]依据解析得到的库索引和表索引,查找得到与所述数据库写访问请求相应的数据库和数据表。[0029]优选的,所述方法还包括:[0030]在所述待写入数据写入成功后,保存写入成功数据与相应分库分表标识的映射关系O[0031]优选的,所述方法还包括:[0032]接收数据库读访问请求;所述数据库读访问请求中携带有待读取数据;[0033]依据所述写入成功数据与相应分库分表标识的映射关系,查找得到与所述数据库读访问请求中所携带的待读取数据对应的分库分表标识;[0034]按照所述分库分表标识的生成规则对与所述数据库读访问请求相应的分库分表标识中的库索引和表索引进行路由;[0035]从与路由结果相应的数据库下的数据表中读取所述待读取数据。[0036]根据本申请的另一实施例,还提供了一种访问数据库的装置,包括:[0037]预置模块,用于预置分库分表标识的生成规则;;[0038]写接收模块,用于接收数据库写访问请求;所述数据库写访问请求中携带有待写入数据;[0039]动态获取库表模块,用于依据所述数据库写访问请求,动态获取当前可用的数据库及该数据库下的数据表信息,并得到相应的库索引和表索引;[0040]拼装模块,用于依据所述分库分表标识的生成规则,对所述库索引和表索引连同静态位进行拼装,得到与所述数据库写访问请求相应的分库分表标识;[0041]写路由模块,用于依据所述分库分表标识的生成规则,对与所述数据库写访问请求相应的分库分表标识中的库索引和表索引进行路由;及[0042]写数据模块,用于将所述待写入数据写入至与路由结果相应的数据库下的数据表中。[0043]优选的,所述动态获取库表模块包括:[0044]随机取库子模块,用于在接收到所述数据库写访问请求时,从应用系统连接的多个数据库中随机获取一个当前可用的数据库;[0045]随机取表子模块,用于从所获取数据库下的多个数据表中随机获取一个数据表。[0046]优选的,所述装置还包括检测数据库是否可用的检测模块,所示检测模块包括:[0047]通讯检测子模块,用于在接收到所述数据库写访问请求时,通过与数据库通讯检测数据库是否可用;或者,[0048]标志判断子模块,用于在接收到所述数据库写访问请求时,依据数据库的可用标志判断数据库是否可用;其中,所述可用标志由数据库管理员依据数据库的状态确定,故障数据库对应的可用标志为不可用,正常运行数据库对应的可用标志为可用。[0049]优选的,所述静态位至少包括如下位中的一种或多种:日期、序号和ID。[0050]优选的,所述拼装模块包括:[0051]位置对应拼装子模块,用于依据所述分库分表标识的生成规则中定义的静态位、库索引和表索引在分库分表标识中的位置,对所述库索引和表索引连同静态位进行拼装,得到与所述数据库写访问请求相应的分库分表标识。[0052]优选的,所述写路由模块包括:[0053]写解析子模块,用于依据所述分库分表标识的生成规则中定义的静态位、库索引和表索引在分库分表标识中的位置,解析出与所述数据库写访问请求相应的分库分表标识中的库索引和表索引;[0054]写查找子模块,用于依据解析得到的库索引和表索引,查找得到与所述数据库写访问请求相应的数据库和数据表。[0055]优选的,所述装置还包括:[0056]保存模块,用于在所述待写入数据写入成功后,保存写入成功数据与相应分库分表标识的映射关系。[0057]优选的,所述装置还包括:[0058]读接收模块,用于接收数据库读访问请求;所述数据库读访问请求中携带有待读取数据;[0059]标识位查找模块,用于依据所述写入成功数据与相应分库分表标识的映射关系,查找得到与所述数据库读访问请求中所携带的待读取数据对应的分库分表标识;[0060]读路由模块,用于按照所述分库分表标识的生成规则对与所述数据库读访问请求相应的分库分表标识中的库索引和表索引进行路由;[0061]读模块,用于从与路由结果相应的数据库下的数据表中读取所述待读取数据。[0062]与现有技术相比,本申请具有以下优点:[0063]现有技术中使用固定的参数进行分库分表,故当已有的数据库规模不能满足日益增长的数据量,需要通过新增数据库的方式来满足需求时,分库分表规则也需要进行变更,因此需要同步地将旧数据库中对应数据迁移到新增的数据库中才能正常使用;[0064]首先,本申请按照所述分库分表规则对与数据库访问请求相应的分库分表标识中的库索引和表索引进行路由,而所述分库分表标识中的库索引和表索引能够用于路由到唯一的数据库和该数据库下的数据表信息;这样,当已有的数据库规模不能满足日益增长的数据量,需要通过新增数据库的方式来满足需求时,已写入数据(旧数据)的分库分表标识能够唯一路由到对应的旧数据库,待写入数据(新数据)的分库分表标识能够唯一路由到对应的新增的数据库(新数据库);因此,本申请在无需变更分库分表规则和无需将旧数据库中对应数据迁移到新数据库的情况下,能够绝对避免将新数据写入旧数据库,以及,从新数据库读取旧数据的现象的问题;因此,相对于现有技术中数据迁移所增加的数据库维护的难度及耗费的物理资源,本申请能够提高数据库维护的便利性,以及,能够节省数据库系统的物理资源。[0065]其次,由于所述分库分表标识中库索引可以为依据数据库写访问请求,动态获取的当前可用的数据库的索引,其中,当前可用的数据库用于表示当前正常运行的数据库;这样,本申请在写数据过程中,只会将数据写入当前正常运行的数据库,出现故障的数据库被自动排除;对于应用系统而言,其完全没有感知到数据库的故障,因此,本申请能够使得同一应用系统访问的多个数据库互为备份,实现主备库的无缝切换,避免业务中断;并且,能够在主库故障时,避免应用系统的配合切换,[0066]另外,本申请能够有效避免主备切换过程中出现数据丢失,出现主备数据不一致,从而需要进行数据迁移的问题;并且,本申请的备库与其对应的主库没有同步关系,数据上不需要保持一致,因此,本申请能够使得主备切换更加可控、灵活。【专利附图】【附图说明】[0067]图1是本申请一种访问数据库的方法实施例1的流程图;[0068]图2是本申请一种访问数据库的方法实施例2的流程图;[0069]图3是本申请一种应用系统访问数据库的流程示意图;[0070]图4是本申请一种访问数据库的装置实施例的结构图。【具体实施方式】[0071]为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和【具体实施方式】对本申请作进一步详细的说明。[0072]参照图1,示出了本申请一种访问数据库的方法实施例1的流程图,具体可以包括:[0073]步骤101、预置分库分表标识的生成规则;[0074]现有技术中通过一个参数来定义分库分表规则,例如:使用用户ID来确定分库分表规则,以用户ID的倒数第二位确定数据库编号,以最后一位确定数据库中的数据表编号。[0075]本申请沿用了这种通过一个参数来定义分库分表规则的方式,不同之处在于,本申请不再使用现有技术中用户ID中数据位这样固定的参数,而是使用包括静态位和动态位的分库分表标识,其中,所述动态位可以进一步包括库索引和表索引。[0076]本申请实施例中,所述分库分表标识中的库索引和表索引能够用于路由到唯一的数据库和该数据库下的数据表信息。例如:应用系统连接的数据库有4个,索引分别为O,I,2,3;要访问的表为tableA,tabIeA在每个数据库中均被拆分为5份,数据表的索引为0,1,2,3,4;假设对于应用系统的一条数据,其所述分库分表标识中的库索引和表索引为24,则该条数据就存储于库索引为2的数据库下表索引为4的那个数据表中。[0077]所述分库分表标识中的静态位能够用于避免分库分表标识重复;因为通常一条数据对应一个分库分表标识,如果分库分表标识中仅包括库索引和表索引,而某数据库下某数据表中不可能仅仅存储一条数据的,这样,同一分库分表标识就会对应多条数据,从而引起数据读取错误。[0078]这样,本申请实施例预置的分库分表标识的生成规则主要用于定义分库分表标识的结构组成,以及,各结构在分库分表标识中的位置等等。具体而言,预置的分库分表标识的生成规则中应当定义:所述分库分表标识中具体可以包括静态位和动态位,所述动态位可以进一步包括库索引和表索引;另外,使用什么样的静态位,以及,静态位、库索引和表索引在分库分表标识中的位置等等。[0079]在本申请的一种应用示例中,所述静态位可以包括序号。例如,某业务系统使用分库分表存储业务数据,则在所述分库分表标识中的库索引和表索引相同时,可以使用序号这样的静态位来区分不同的条数据,例如,24001,24002,24003等分库分表标识中,24用于表示库索引和表索引,001-003则用于表示序号;在实际中,序号可以依据存储时间进行排序。[0080]在本申请的另一种应用示例中,所述静态位可以包括日期和序号。例如,某业务系统使用分库分表存储业务数据,则在所述分库分表标识中的库索引和表索引相同时,可以使用日期和序号这样的静态位来区分不同的条数据,例如,2012010124001,2012010124002,2012010124003等分库分表标识中,20120101用于表示日期,24用于表示库索引和表索引,001-003则用于表示序号;在实际中,日期可以为数据写入相应数据表的日期,序号可以依据存储时间进行排序。[0081]当然,上述日期和序号只是作为静态位的一种示例,本领域技术人员还可以依据实际需求,预置其它静态位,如用户ID等等,总之,所述分库分表标识中的静态位主要用于避免分库分表标识重复的作用下,本申请不对具体的静态位加以限制。[0082]同时,需要说明的是,本申请实施例中的静态位即可以是系统随机生成,也可以是系统自动读取数据中的一个或多个规定字段,如日期、序号、用户ID等。所述分库分表标识的生成规则也包括了静态位的生成规则。[0083]本申请实施例中,由于分库分表标识的生成规则定义有分库分表标识的结构组成,以及,各结构在分库分表标识中的位置;这样,在写数据的路由过程中,就可以分库分表标识的生成规则对分库分表标识进行解析,精确地定位到分库分表标识中的库索引和表索弓丨,从而才可以进行精确的路由,以及得到精确的路由结果。例如,对于2012010124001的分库分表标识,分库分表规则中定义第1-8位表示日期,第9位表示库索引,第10位表示表索引,第11-13位表示序号,则依据分库分表规则,则可以精确地定位到分库分表标识中的库索引和表索引。[0084]步骤102、接收数据库写访问请求;所述数据库写访问请求中携带有待写入数据;[0085]步骤103、依据所述数据库写访问请求,动态获取当前可用的数据库及该数据库下的数据表信息,并得到相应的库索引和表索引;[0086]本申请实施例中,当前可用的数据库用于表示当前正常运行的数据库,本申请可以提供如下检测数据库是否可用的方案:[0087]检测方案1、在接收到所述数据库写访问请求时,通过与数据库通讯检测数据库是否可用;[0088]所述通过与数据库通讯检测数据库是否可用的步骤具体可以为,向数据库发送检测数据包,如在预置时间内收到该数据库的响应数据包,则判断该数据库处于正常运行中,也即该数据库可用;否则,如果在预置时间内未收到该数据库的响应数据包,则判断该数据库不能正常运行,也即该数据库不可用。[0089]当然,除了上述检测数据包和响应数据包的通讯方式外,还可以其它通讯方式检测数据库进行可用,本申请不局限于具体的通讯方式。例如,可以基于心跳检测的通讯方式检测数据库是否可用;例如:每隔预置时间段(如I分钟)进行一次心跳检测,检测所连接的数据库是否可用:数据库每I分钟发一个心跳检测数据帧,接收到数据帧表示数据库可用,否则表示数据库不可用。[0090]检测方案2、在接收到所述数据库写访问请求时,依据数据库的可用标志判断数据库是否可用;其中,所述可用标志由数据库管理员依据数据库的状态确定,故障数据库对应的可用标志为不可用,正常运行数据库对应的可用标志为可用。[0091]在实际应用中,数据库的可用标志可存储于一个状态表中,该状态表针对数据库,其仅包括一个数据字段——可用标志,其值为可用或不可用;访问状态表,即可获取相应数据库的可用标志。[0092]在本申请的一种优选实施例中,所述依据所述数据库写访问请求,动态获取当前可用的数据库及该数据库下的数据表信息的步骤,可以进一步包括:[0093]在接收到所述数据库写访问请求时,以及,从该数据库下的多个数据表中随机获取一个数据表。[0094]在分库分表技术中,通常应用系统连接有多个数据库,本申请从应用系统连接的多个数据库中随机获取一个当前可用的数据库的过程可以为:首先从所有当前可用的数据库,然后从中随机选取一个;或者,从所述多个数据库中随机获取一个,并检测其可是否可用,若可用则选定该数据库,若不可用则从剩余的数据库中随机获取一个,继续检测其是否可用,以此类推,直至选定一个当前可用的数据库。[0095]同理,在分库分表技术中,一个数据库下也是有多个数据表的,本申请也可以随机获取一个以存储待写入数据。[0096]在此结合示例3进行说明:应用系统连接的数据库有4个,索引分别为0,1,2,3;要访问的表为tableA,tableA在每个数据库中均被拆分为5份,数据表的索引为O,1,2,3,4;假设对于应用系统的一条数据;则依据所述数据库写访问请求,动态获取当前可用的数据库及该数据库下的数据表信息,得到的结果可以是一个排列组合,如24、31、32、33、34、35、11、12、13、14、15等;以24为例,2表示可用数据库的索引(库索引),4表示索引为2这个数据库中可以写入数据的数据表的索引(表索引)。[0097]步骤104、依据所述分库分表标识的生成规则,对所述库索引和表索引连同静态位进行拼装,得到与所述数据库写访问请求相应的分库分表标识;[0098]由于分库分表标识的生成规则定义有分库分表标识的结构组成,以及,结构在分库分表标识中的位置;且步骤103已获取其中的结构库索引和表索引,那么,步骤104依据所述分库分表标识的生成规则,对所述库索引和表索引连同静态位进行拼装,即可得到与所述数据库写访问请求相应的分库分表标识。[0099]在此说明获取静态位的过程。由于所述分库分表标识的生成规则中定义有使用什么样的静态位,那么根据相关定义得到静态位。假设静态位包括有日期、序号和ID中一项或多项,则获取日期的过程可以为:依据所述数据库写访问请求的接收时间获取相应的日期,获取序号的过程可以为:按照接收顺序对所述日期的所述数据库写访问请求进行编号,当前数据库写访问请求对应的编号即为序号;获取ID的过程可以为:获取当前数据库写访问请求对应的用户ID。[0100]由于所述分库分表标识的生成规则中定义有静态位、库索引和表索引在分库分表标识中的位置,那么,可以依据各自的位置对所述库索引和表索引连同静态位进行拼装。[0101]在此提供一个拼装的例子:[0102]假设依据所述分库分表标识的生成规则,静态位包括有日期和序号,且所述分库分表标识中日期、库索引、表索引和序号的位置分别为:1-8,9,10,11-13;且当前数据库写访问请求对应的日期、库索引、表索引和序号分别为20120101,2,4,001,那么可以拼装得到2012010124001的分库分表标识。[0103]步骤105、依据所述分库分表标识的生成规则,对与所述数据库写访问请求相应的分库分表标识中的库索引和表索引进行路由;[0104]路由是查找到所述数据库写访问请求相应的分库分表标识对应的表和库的过程。[0105]在具体实现中,可以依据所述分库分表标识的生成规则,对与所述数据库写访问请求相应的分库分表标识进行解析,得到其中的库索引和表索引,然后根据解析得到的库索引和表索引查找得到与所述数据库写访问请求相应的数据库和数据表。由于路由为本【
技术领域
】内的公知技术,故在此不作赘述。[0106]步骤106、将所述待写入数据写入至与路由结果相应的数据库下的数据表中。[0107]在此通过对比现有技术和本申请来说明本申请的优点:[0108]一、由于现有技术中使用固定的参数进行分库分表,故当已有的数据库规模不能满足日益增长的数据量,需要通过新增数据库的方式来满足需求时,分库分表规则也需要进行变更,因此需要同步地将旧数据库中对应数据迁移到新增的数据库中才能正常使用。[0109]示例1:分库分表规则为用户ID倒数第二位,1、3、5、7、9进A库;0、2、4、6、8进B库;当新增一个C库来管理数据时,现有技术中需要将分库分表规则改为1、3、5进A库,O、2、4进B库,6、7、8、9进C库。在分库分表规则修改后,必须将原有A库、B库中用户ID倒数第二位为6、7、8、9的数据全部迁移到C库,否则使用新的分库分表规则将会导致旧数据库中某些数据无法读取;而所述数据迁移无疑增加了数据库维护的难度,且消耗了大量的(PU资源或内存资源。[0110]由于本申请实施例中,写数据和读数据均是对分库分表标识来进行路由的,而所述分库分表标识中的库索引和表索引能够用于路由到唯一的数据库和该数据库下的数据表信息;这样,当已有的数据库规模不能满足日益增长的数据量,需要通过新增数据库的方式来满足需求时,已写入数据(旧数据)的分库分表标识能够唯一路由到对应的旧数据库,待写入数据(新数据)的分库分表标识能够唯一路由到对应的新增的数据库(新数据库);因此,本申请在无需变更分库分表规则和无需将旧数据库中对应数据迁移到新数据库的情况下,也能绝对避免将新数据写入旧数据库,以及,从新数据库读取旧数据的现象的问题;因此本申请能够提高数据库维护的便利性,以及,能够节省数据库系统的物理资源。[0111]假设上述示例I中的A库B库的库索引分别为1,2,新增的C库的库索引为3;由于本申请在写数据时,是对分库分表标识进行路由的,故旧数据均被写入库索引为I或2的数据库,只有新数据才会被写入索引为3的C库;以及,本申请在读取旧数据时,也是对分库分表标识进行路由的,不存在从C库读取A库的数据这种情况,因此本申请在数据库扩容时无需进行数据迁移。[0112]二、目前数据库的备份技术很多,如双机热备等,备份的一个目的是为了在主库出现故障时,备库能够立即启用并维持应用系统运行。例如:应用系统连接了4个数据库,索引分别为0,1,2,3;传统的数据库备份方法是:分别针对索引为0,1,2,3的主库建立相应的备库O’,I’,2’,3’,这样,当O库出现故障时,把O’库启用,当I库出现故障时,把I’库启用,当2库出现故障时,把2’库启用,当2库出现故障时,把2’库启用等等。[0113]传统的数据库备份方法具有如下缺点:[0114]1、当主库故障时,切换到备库需要应用配合切换;[0115]本【
技术领域
】中,将主库切换到备库的过程具体为:修改主库DNS(域名系统,DomainNameSystem)指向备库,设置备库为主库,以通过DNS修改达到数据库切换目的。由于网络识别DNS地址更新需要一段时间,应用系统的数据库连接池也需要对数据库地址信息有缓存;因此,为了能快速达到数据库切换效果,减少切换期间产生的业务影响,需要应用系统进行重新启动。[0116]2、当数据库故障时,如果备库短时间内不能正常启用,将导致业务中断;[0117]3、当数据库切换到备库后,原主库中的数据如果存在没有及时同步到备库的数据,会出现主备数据库数据不一致,需要将原主库中未同步的数据迁移到备库中。[0118]本申请实施例中,由于所述分库分表标识中库索引为依据数据库写访问请求,动态获取的当前可用的数据库的索引,其中,当前可用的数据库用于表示当前正常运行的数据库;这样,本申请在写数据过程中,只会将数据写入当前正常运行的数据库,出现故障的数据库被自动排除;对于应用系统而言,其完全没有感知到数据库的故障,因此本申请能够使得同一应用系统访问的多个数据库互为备份,实现主备库的无缝切换,避免业务中断;并且,能够在主库故障时,避免应用系统的配合切换,[0119]另外,本申请能够有效避免主备切换过程中出现数据丢失,出现主备数据不一致,从而需要进行数据迁移的问题;并且,本申请的备库与其对应的主库没有同步关系,数据上不需要保持一致,因此,本申请能够使得主备切换更加可控、灵活。[0120]在此通过示例2进行说明:应用系统连接了4个数据库,索引分别为0,I,2,3;本申请将0,1,2,3这4个数据库互相作为备库,O库的备库是1,2,3;1库的备份是0,2,3;2库的备库是1,3,O;3库的备份是0,I,2。[0121]由于所述分库分表标识中库索引为依据数据库写访问请求,动态获取的当前可用的数据库的索引,这样,本申请在写数据过程中,只会将数据写入当前正常运行的数据库,出现故障的数据库被自动排除;1库故障了,就不会将应用系统的数据写入I库。检测当前数据库是否可用的方案在后续会有详细说明。[0122]总之,本申请能够实现主备库的无缝切换,以及,能够保证新业务在数据库故障时持续运行。[0123]需要说明的是,本领域技术人员还可以在使用本申请的同时,使用传统的双机热备方法,如示例2中分别针对索引为0,I,2,3的主库建立相应的备库O’,I’,2’,3’等等,本申请的主要效果在于实现主备库的无缝切换,以及,保证新业务在数据库故障时持续运行,而不会对保证数据库一致性和同步性的其它方法加以限制。[0124]在本申请的一种优选实施例中,所述方法还可以包括:在所述待写入数据写入成功后,保存写入成功数据与相应分库分表标识位的映射关系。[0125]参照图2,示出了本申请一种访问数据库的方法实施例2的流程图,具体可以包括:[0126]步骤201、预置分库分表标识的生成规则;[0127]步骤202、在待写入数据写入成功后,保存写入成功数据与相应分库分表标识的映身寸关系;[0128]步骤203、接收数据库读访问请求;所述数据库读访问请求中携带有待读取数据;[0129]步骤204、依据所述写入成功数据与相应分库分表标识的映射关系,查找得到与所述数据库读访问请求中所携带的待读取数据对应的分库分表标识;[0130]步骤205、按照所述分库分表标识的生成规则对与所述数据库读访问请求相应的分库分表标识中的库索引和表索引进行路由;[0131]步骤206、从与路由结果相应的数据库下的数据表中读取所述待读取数据。[0132]相对于实施例1,实施例2介绍了依据数据库读访问请求访问数据库的技术方案,其中,读数据过程中需要对分库分表标识来进行路由。在实际应用中,应用系统在写数据成功后,可以保存相应数据的分库分表标识,这样,在从数据库读取数据时,可以采用记录的分库分表标志位作为筛选条件读取数据。[0133]在本申请的一种优选实施例中,所述按照所述分库分表标识的生成规则对与所述数据库读访问请求相应的分库分表标识中的库索引和表索引进行路由的步骤,具体可以包括:[0134]依据所述分库分表标识的生成规则中定义的静态位、库索引和表索引在分库分表标识中的位置,解析出与所述数据库读访问请求相应的分库分表标识中的库索引和表索弓I;[0135]依据解析得到的库索引和表索引,查找得到与所述数据库读访问请求相应的数据库和数据表。[0136]例如,如果待读取数据的分库分表标识为24,则路由结果可以为:从第3个数据库下的第5个tableA读取数据,故读数据过程可以顺利完成。[0137]为使本领域技术人员更好地理解本申请,参照图5所示的本申请一种应用系统访问数据库的流程示意图,应用系统301访问数据库A、数据库B、数据库C和数据D时均会通过分库分表组件302按照分库分表规则进行路由;其中,分库分表组件302可作为一个独立的组件,也可部署在应用系统301中;所述应用系统访问数据库的流程具体可以包括:[0138]步骤S1、分库分表组件302预置符合分库分表规则的分库分表标识;所述分库分表标识中具体可以包括静态位和动态位;所述动态位可以进一步包括库索引和表索引;[0139]步骤S2、应用系统301接收业务请求,准备将业务请求写入数据库,于是向分库分表组件302发送数据库写访问请求,所述数据库写访问请求中携带有待写入数据;[0140]步骤S3、分库分表组件302依据所述数据库写访问请求,动态获取当前可用的数据库及该数据库下的数据表信息,并得到相应的库索引和表索引;[0141]步骤S4、分库分表组件302对所述静态位、库索引和表索引进行拼装,得到符合分库分表规则的与所述数据库写访问请求相应的分库分表标识;[0142]步骤S5、分库分表组件302将所述待写入数据写入至与路由结果相应的数据库下的数据表中;[0143]步骤S6、应用系统301接收业务请求,准备依据业务请求从数据库读取数据,于是向分库分表组件302发送数据库读访问请求;所述数据库读访问请求中携带有待读取数据的分库分表标识;[0144]步骤S7、分库分表组件302按照所述分库分表规则对与所述数据库访问请求相应的分库分表标识中的库索引和表索引进行路由;[0145]步骤S8、分库分表组件302从与路由结果相应的数据库下的数据表中读取所述待读取数据。[0146]与前述方法实施例相应,本申请还公开了一种访问数据库的装置,参照图4所示的结构图,具体可以包括:[0147]预置模块401,用于预置分库分表标识的生成规则;;[0148]写接收模块402,用于接收数据库写访问请求;所述数据库写访问请求中携带有待写入数据;[0149]动态获取库表模块403,用于依据所述数据库写访问请求,动态获取当前可用的数据库及该数据库下的数据表信息,并得到相应的库索引和表索引;[0150]拼装模块404,用于依据所述分库分表标识的生成规则,对所述库索引和表索引连同静态位进行拼装,得到与所述数据库写访问请求相应的分库分表标识;[0151]写路由模块405,用于依据所述分库分表标识的生成规则,对与所述数据库写访问请求相应的分库分表标识中的库索引和表索引进行路由;及[0152]写数据模块406,用于将所述待写入数据写入至与路由结果相应的数据库下的数据表中。[0153]在本申请的一种优选实施例中,所述动态获取库表模块403具体可以包括:[0154]随机取库子模块,用于在接收到所述数据库写访问请求时,从应用系统连接的多个数据库中随机获取一个当前可用的数据库;[0155]随机取表子模块,用于从所获取数据库下的多个数据表中随机获取一个数据表。[0156]在本申请的另一种优选实施例中,还包括检测数据库是否可用的检测模块,所示检测模块包括:[0157]通讯检测子模块,用于在接收到所述数据库写访问请求时,通过与数据库通讯检测数据库是否可用;或者,[0158]标志判断子模块,用于在接收到所述数据库写访问请求时,依据数据库的可用标志判断数据库是否可用;其中,所述可用标志由数据库管理员依据数据库的状态确定,故障数据库对应的可用标志为不可用,正常运行数据库对应的可用标志为可用。[0159]在本申请的再一种优选实施例中,所述静态位至少可以包括如下位中的一种或多种:日期、序号和ID。[0160]在本申请的一种优选实施例中,所述拼装模块404具体可以包括:[0161]位置对应拼装子模块,用于依据所述分库分表标识的生成规则中定义的静态位、库索引和表索引在分库分表标识中的位置,对所述库索引和表索引连同静态位进行拼装,得到与所述数据库写访问请求相应的分库分表标识。[0162]在本申请的另一种优选实施例中,所述写路由模块405具体可以包括:[0163]写解析子模块,用于依据所述分库分表标识的生成规则中定义的静态位、库索引和表索引在分库分表标识中的位置,解析出与所述数据库写访问请求相应的分库分表标识中的库索引和表索引;[0164]写查找子模块,用于依据解析得到的库索引和表索引,查找得到与所述数据库写访问请求相应的数据库和数据表。[0165]在本申请的再一种优选实施例中,所述装置还可以包括:[0166]保存模块,用于在所述待写入数据写入成功后,保存写入成功数据与相应分库分表标识的映射关系。[0167]在本申请的一种优选实施例中,所述装置还可以包括:[0168]读接收模块,用于接收数据库读访问请求;所述数据库读访问请求中携带有待读取数据;[0169]标识位查找模块,用于依据所述写入成功数据与相应分库分表标识的映射关系,查找得到与所述数据库读访问请求的分库分表标识;[0170]读路由模块,用于按照所述分库分表标识的生成规则对与所述数据库读访问请求相应的分库分表标识中的库索引和表索引进行路由;[0171]读模块,用于从与路由结果相应的数据库下的数据表中读取所述待读取数据。[0172]本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。[0173]本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。[0174]本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。[0175]这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。[0176]这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。[0177]尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。[0178]以上对本申请所提供的一种访问数据库的方法和装置,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在【具体实施方式】及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。【权利要求】1.一种访问数据库的方法,其特征在于,包括:预置分库分表标识的生成规则;接收数据库写访问请求;所述数据库写访问请求中携带有待写入数据;依据所述数据库写访问请求,动态获取当前可用的数据库及该数据库下的数据表信息,并得到相应的库索引和表索引;依据所述分库分表标识的生成规则,对所述库索引和表索引连同静态位进行拼装,得到与所述数据库写访问请求相应的分库分表标识;依据所述分库分表标识的生成规则,对与所述数据库写访问请求相应的分库分表标识中的库索引和表索引进行路由;将所述待写入数据写入至与路由结果相应的数据库下的数据表中。2.如权利要求1所述的方法,其特征在于,所述依据所述数据库写访问请求,动态获取当前可用的数据库及该数据库下的数据表信息的步骤,包括:在接收到所述数据库写访问请求时,从应用系统连接的多个数据库中随机获取一个当前可用的数据库,以及,从该数据库下的多个数据表中随机获取一个数据表。3.如权利要求1或2所述的方法,其特征在于,通过如下步骤检测数据库是否可用:在接收到所述数据库写访问请求时,通过与数据库通讯检测数据库是否可用;或者,在接收到所述数据库写访问请求时,依据数据库的可用标志判断数据库是否可用;其中,所述可用标志由数据库管理员依据数据库的状态确定,故障数据库对应的可用标志为不可用,正常运行数据库对应的可用标志为可用。4.如权利要求1或2所述的方法,其特征在于,所述静态位至少包括如下位中的一种或多种:日期、序号和ID。5.如权利要求1或2所述的方法,其特征在于,所述依据所述分库分表标识的生成规贝U,对所述库索引和表索引连同静态位进行拼装的步骤,包括:依据所述分库分表标识的生成规则中定义的静态位、库索引和表索引在分库分表标识中的位置,对所述库索引和表索引连同静态位进行拼装,得到与所述数据库写访问请求相应的分库分表标识。6.如权利要求1或2所述的方法,其特征在于,所述依据所述分库分表标识的生成规贝U,对与所述数据库写访问请求相应的分库分表标识中的库索引和表索引进行路由的步骤,包括:依据所述分库分表标识的生成规则中定义的静态位、库索引和表索引在分库分表标识中的位置,解析出与所述数据库写访问请求相应的分库分表标识中的库索引和表索引;依据解析得到的库索引和表索引,查找得到与所述数据库写访问请求相应的数据库和数据表。7.如权利要求1或2所述的方法,其特征在于,还包括:在所述待写入数据写入成功后,保存写入成功数据与相应分库分表标识的映射关系。8.如权利要求7所述的方法,其特征在于,还包括:接收数据库读访问请求;所述数据库读访问请求中携带有待读取数据;依据所述写入成功数据与相应分库分表标识的映射关系,查找得到与所述数据库读访问请求中所携带的待读取数据对应的分库分表标识;按照所述分库分表标识的生成规则对与所述数据库读访问请求相应的分库分表标识中的库索引和表索引进行路由;从与路由结果相应的数据库下的数据表中读取所述待读取数据。9.一种访问数据库的装置,其特征在于,包括:预置模块,用于预置分库分表标识的生成规则;;写接收模块,用于接收数据库写访问请求;所述数据库写访问请求中携带有待写入数据;动态获取库表模块,用于依据所述数据库写访问请求,动态获取当前可用的数据库及该数据库下的数据表信息,并得到相应的库索引和表索引;拼装模块,用于依据所述分库分表标识的生成规则,对所述库索引和表索引连同静态位进行拼装,得到与所述数据库写访问请求相应的分库分表标识;写路由模块,用于依据所述分库分表标识的生成规则,对与所述数据库写访问请求相应的分库分表标识中的库索引和表索引进行路由;及写数据模块,用于将所述待写入数据写入至与路由结果相应的数据库下的数据表中。10.如权利要求9所述的装置,其特征在于,所述动态获取库表模块包括:随机取库子模块,用于在接收到所述数据库写访问请求时,从应用系统连接的多个数据库中随机获取一个当前可用的数据库;随机取表子模块,用于从所获取数据库下的多个数据表中随机获取一个数据表。11.如权利要求9或10所述的装置,其特征在于,还包括检测数据库是否可用的检测模块,所示检测模块包括:通讯检测子模块,用于在接收到所述数据库写访问请求时,通过与数据库通讯检测数据库是否可用;或者,标志判断子模块,用于在接收到所述数据库写访问请求时,依据数据库的可用标志判断数据库是否可用;其中,所述可用标志由数据库管理员依据数据库的状态确定,故障数据库对应的可用标志为不可用,正常运行数据库对应的可用标志为可用。12.如权利要求9或10所述的装置,其特征在于,所述静态位至少包括如下位中的一种或多种:日期、序号和ID。13.如权利要求9或10所述的装置,其特征在于,所述拼装模块包括:位置对应拼装子模块,用于依据所述分库分表标识的生成规则中定义的静态位、库索引和表索引在分库分表标识中的位置,对所述库索引和表索引连同静态位进行拼装,得到与所述数据库写访问请求相应的分库分表标识。14.如权利要求9或10所述的装置,其特征在于,所述写路由模块包括:写解析子模块,用于依据所述分库分表标识的生成规则中定义的静态位、库索引和表索引在分库分表标识中的位置,解析出与所述数据库写访问请求相应的分库分表标识中的库索引和表索引;写查找子模块,用于依据解析得到的库索引和表索引,查找得到与所述数据库写访问请求相应的数据库和数据表。15.如权利要求9或10所述的装置,其特征在于,还包括:保存模块,用于在所述待写入数据写入成功后,保存写入成功数据与相应分库分表标识的映射关系。16.如权利要求15所述的装置,其特征在于,还包括:读接收模块,用于接收数据库读访问请求;所述数据库读访问请求中携带有待读取数据;标识位查找模块,用于依据所述写入成功数据与相应分库分表标识的映射关系,查找得到与所述数据库读访问请求中所携带的待读取数据对应的分库分表标识;读路由模块,用于按照所述分库分表标识的生成规则对与所述数据库读访问请求相应的分库分表标识中的库索引和表索引进行路由;读模块,用于从与路由结果相应的`数据库下的数据表中读取所述待读取数据。【文档编号】G06F17/30GK103714097SQ201210380786【公开日】2014年4月9日申请日期:2012年10月9日优先权日:2012年10月9日【发明者】曹刚,周兴江,王文治申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1