具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示意性地图示了根据本发明的实施例的处理数据库操作请求的方法的流程图,并且图2示意性地图示了根据本发明的一个实施例的处理数据库操作请求的方法各步骤的流程图。下面将接合图1和图2对本发明进行详细的描述。
根据本发明的实施例,数据库例如可以是MySQL数据库。在下文中,以MySQL数据库为例,对本发明的原理进行描述,然而,这只是为了示例的目的,本发明的范围并不限于此,本发明的原理同样适用于其它类型的数据库,例如IBM DB2、Oracle 10等数据库。
如图1所示,根据本发明的实施例的处理数据库操作请求的方法100适于步骤S101,其中,接收对于数据库的操作请求。该对于数据库的操作请求例如来自于一个或者多个应用服务器。
同样参见图2,首先,可以存储来自例如一个或者多个数据库服务器的分表信息。根据本发明的实施例,该分表信息可以包括要进行分表的数据表的数据表名以及与该数据表名相关联的分表字段。
接下来,在步骤S101中,从一个或者多个应用服务器接收对于数据库的操作请求,如果没有接收到,则继续等待;如果已经接收到,则进入下一步骤,即图1所示的步骤S103。
根据本发明的实施例,该操作请求可以包括数据库程序语言语句。可选地,该数据库程序语言语句可以是SQL(Structured Query Language,结构化查询语言)语句。然而,SQL语言和SQL语句仅为示例,用于帮助读者理解本发明的原理,本发明的范围并不限于此,而是同样适用于其它适当的数据库程序语言和相对应的语句。
在步骤S103中,解析该操作请求,以获取该操作请求中的第一数据表名(例如table)。此时,如果该操作请求中不存在第一数据表名(例如不存在table),则说明该操作请求不是针对某张表的操作,那么就可以将操作请求直接发送给数据库服务器。
而如果操作请求中存在第一数据表名,则执行如图1所示的步骤S 105,其中,根据分表信息解析该操作请求,以获取该操作请求中与第一数据表名相关联的分表字段以及与该分表字段相对应的字段值。
例如,假设将数据表table拆分为100张子表,分别称为table_0、table_1、…、table_99,整数型字段id被设置为分表字段。此时,如果操作请求中所包括的SQL语句为SELECT*FROM table WHERE name=“zhangsan”AND id=123,则操作请求中与第一数据表名table相关联的分表字段为id,与该分表字段相对应的字段值为123。
在步骤S105中,如果第一数据表名不在分表信息中,则说明第一数据表名所代表的数据表未被拆分为多张分表,那么就可以直接将操作请求发送给数据库服务器。而如果第一数据表名在该分表信息中、但未从操作请求中解析出与第一数据表名相关联的分表字段及该分表字段相对应的字段值,则无法判断该操作请求是针对哪张子表进行操作,就可以返回错误提示,例如,向应用服务器返回“操作请求错误,未包含分表字段”的错误提示。
接下来,执行步骤S107,其中,根据分表信息和所获取的分表字段相对应的字段值,将操作请求中的第一数据表名修改为第二数据表名。
根据本发明的实施例,分表信息还可以包括要进行分表的数据表的子表数量,在步骤S107中,可以根据与分表字段相对应的字段值以及数据表的子表数量,将第一数据表名修改为第二数据表名。根据本发明的实施例,第二数据表名对应于第一数据表分表之后生成的多个第二数据表之一,其包括第一数据表名以及第二数据表标识。
例如,仍以上述SQL语句SELECT*FROM table WHERE name=“zhangsan”AND id=123为例进行描述。根据与分表字段相对应的字段值123以及数据表的子表数量100,可以采用求模方式的分表策略,即,123对100求模,得到23,则说明该SQL语句实际是要对子表table_23进行操作,第二数据表名即为table_23,包括第一数据表名table以及第二数据表标识23,从而可以将操作请求中的SQL语句修改为SELECT*FROMtable_23WHERE name=“zhangsan”AND id=123,即,从子表table_23中选择“zhangsan”字段进行操作。
之后,如图1所示,执行步骤S109,将修改后的操作请求发送给数据库服务器。例如,将包括修改后的SQL语句SELECT*FROM table_23WHERE name=“zhangsan”AND id=123的操作请求发送给数据库服务器。
根据本发明的实施例,如图2所示,方法100还可以包括以下步骤:检查分表信息是否已经更新(例如,子表数量变化,新拆分了某些表等),如果已更新,则在上述步骤S101之前,存储更新后的分表信息,并在步骤S105中,根据更新后的分表信息来解析操作请求。
下面,为了帮助读者理解本发明,结合一个具体示例来说明本发明的原理。
假设第一数据表名为person的数据表被分为10张子表,分表字段为pid,第一数据表名为student的数据表被分为100张子表,分表字段为no,则分表信息可以如下:table[1]={person,10,pid},table[2]={student,100,no}。
假设操作请求中包括的SQL语句为SELECT*FROM person WHEREpid=123。首先,解析操作请求,获取第一数据表名person,然后根据分表信息解析得到分表字段pid以及与分表字段相对应的字段值123,将123对10求模,得到结果3。于是,就可以将原SQL语句中的第一数据表名person修改为第二数据表名person_3,然后将包括修改后的SQL语句SELECT*FROM person_3WHERE pid=123的操作请求发送给数据库服务器来执行。
另外,假设操作请求中包括的SQL语句为INSERT INTO student(`no`,`name`)VALUES(246,‘zhangsan’)。首先,解析操作请求,获取第一数据表名student,然后根据分表信息解析得到分表字段no以及与分表字段相对应的字段值,将246对100取模,得到结果46。于是,就可以将原SQL语句中的第一数据表名student修改为第二数据表名student_46,然后将包括修改后的SQL语句INSERT INTO student_46(`no`,`name`)VALUES(246,‘zhangsan’)的操作请求发送给数据库服务器来执行。
本发明公开了一种处理数据库操作请求的方法。根据本发明的实施例,根据来自数据库服务器的分表信息,解析应用服务器对于数据库的操作请求,以获取第一数据表名、与其相关联的分表字段以及字段值,并且根据分表信息和字段值将第一数据表名修改为第二数据表名,并将修改后的操作请求发送给数据库服务器。由此,使得分表的过程对应用透明化,应用编写人员不再需要控制数据与具体的子表之间的对应关系,无论物理上存在多少张子表,应用编写人员所面对的是始终是逻辑上的一张表,应用编写人员不再需要关心数据库分表策略的实现细节,可以专注于编写具体的业务代码,只需在对于数据库的操作请求中包含分表字段的值即可。另外,根据本发明的实施例,通过更新分表信息,可以避免子表数量等分表信息的变化对应用的影响,应用只需要开发一次,不再需要由于数据库分表信息的调整而修改应用本身,极大地降低了维护成本。
与上述方法100相对应,本发明还提供了一种处理数据库操作请求的设备200。图3示意性地图示了根据本发明的实施例的处理数据库操作请求的设备200。参见图3,设备200主要包括应用程序接口201、解析器203、操作请求修改器205、以及数据库接口207。
根据本发明的实施例,应用接口201从应用服务器300-1到300-n接收对于数据库的操作请求。然后解析器203对应用接口201接收的操作请求进行解析,以获取操作请求中的第一数据表名,并且根据分表信息解析操作请求,以获取操作请求中与第一数据表名相关联的分表字段以及与该分表字段相对应的字段值。
分表信息包括要进行分表的数据表的数据表名以及与该数据表名相关联的分表字段。例如,假设第一数据表名为person的数据表被分为10张子表,分表字段为pid,第一数据表名为student的数据表被分为100张子表,分表字段为no,则分表信息可以如下:table[1]={person,10,pid},table[2]={student,100,no}。
操作请求修改器205根据分表信息和解析器203所获取的分表字段相对应的字段值,将操作请求中的第一数据表名修改为第二数据表名。
假设操作请求中包括的SQL语句为SELECT*FROM person WHEREpid=123。解析器203获取的第一数据表名为person,与分表字段pid相对应的字段值123。操作请求修改器205将123对10求模,得到结果3。于是,操作请求修改器205就可以将原SQL语句中的第一数据表名person修改为第二数据表名person_3。
数据库接口207将操作请求修改器205修改后的操作请求发送给数据库服务器。应用接口201可以用于执行上述处理数据库操作请求的方法100中的步骤S101,解析器203可以用于执行步骤S103和S105,操作请求修改器205可以用于执行步骤S 107,数据库接口可以用于执行步骤S109。
根据本发明的实施例,操作请求可以包括数据库程序语言语句。可选地,数据库程序语言语句可以是SQL语句,数据库可以是MySQL数据库。如上所述,SQL语句和MySQL数据库仅为本发明的示例,并不意在限制本发明。
根据本发明的实施例,如果解析器203解析操作请求时、操作请求中不存在第一数据表名,则说明该操作请求不是针对某张表的操作,那么数据库接口207就可以将操作请求直接发送给数据库服务器。
而在解析器203根据分表信息解析操作请求时,如果第一数据表名不在分表信息中,则说明第一数据表名所代表的数据表未被拆分为多张分表,那么数据库接口207就可以将操作请求发送给数据库服务器。
如果第一数据表名在分表信息中、但解析器203未从操作请求中解析出与第一数据表名相关联的分表字段及该分表字段相对应的字段值,则返回错误提示,例如,向应用服务器300-1到300-n返回“操作请求错误,未包含分表字段”的错误提示。
根据本发明的实施例,分表信息还包括要进行分表的数据表的子表数量,操作请求修改器205根据与分表字段相对应的字段值以及数据表的子表数量,将第一数据表名修改为第二数据表名,第二数据表名对应于第一数据表分表之后生成的多个第二数据表之一,其包括第一数据表名以及第二数据表标识。仍以上面针对方法100描述的SQL语句为例,可以将第一数据表名table修改为第二数据表名table_23,然后将包括修改后的SQL语句SELECT*FROM table_23WHERE name=“zhangsan”AND id=123的操作请求发送给数据库服务器。
根据本发明的实施例,数据库接口207还可以检查分表信息是否已经更新(例如,子表数量变化,新拆分了某些表等),如果已更新,则存储更新后的分表信息,供解析器203用来解析操作请求。
由于上述各设备实施例与前述各方法实施例相对应,因此不再对各设备实施例进行详细描述。
根据本发明的又一方面,还提供了一种分配数据库操作请求的***1000。参见图3,***1000包括上述设备200;一个或者多个应用服务器300-1,…,300-n,适于向设备200发送对于数据库的操作请求;以及数据库服务器400-1,…,400-n,适于向设备200提供分表信息,并且接收设备200发送的修改后的操作请求。
在此提供的算法和显示不与任何特定计算机、虚拟***或者其它设备固有相关。各种通用***也可以与基于在此的示教一起使用。根据上面的描述,构造这类***所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的装置中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个装置中。可以把实施例中的若干模块组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者模块中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个装置实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的***中的一些或者全部模块的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。