具体实施方式
在本申请实施例中,对数据库语句的编译过程为:接收携带数据库访问语句的预编译请求,当该数据库访问语句中包含的数据表标识为分表标识时,根据预先保存的分表标识与总表标识的对应关系,将该数据库访问语句中的分表标识替换为总表标识,最后对替换后的数据库访问语句进行预编译。对应的对数据库语句的执行过程为:接收待执行数据库访问语句,先判断该待执行数据库访问语句是否存在对应的预编译数据库访问语句,若否,则对该待执行数据库访问语句进行预编译后再执行,若是,则根据预先记录的该待执行数据库访问语句对应的替换关系,将该待执行数据库访问语句对应的预编译数据访问语句中的总表标识替换为对应的分表标识,再执行替换后的预编译数据库访问语句。可见本申请所述的方法,在进行数据库访问语句的预编译时,当该数据库访问语句中数据表标识是分表标识时,针对每个分表的结构相同的数据库访问语句,只需一次预编译即可,无需重复进行编译。并且,在执行对应各分表的待执行数据库访问语句时,可以根据对应的替换关系,将预编译数据库语句中的总表标识替换为对应的分表标识,并执行。可见,在使用本申请的方法进行数据库语句编译和执行时,既达到了预编译数据库语句可以提高数据库语句执行效率的效果,同时也避免了现有技术中重复预编译的缺点,降低了对预编译数据库语句的存储压力,提高了数据库语言的执行效率。
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图1为本申请实施例提供的数据库语句编译过程,具体包括以下步骤:
S101:接收携带数据库访问语句的预编译请求。
在本申请实施例中,终端接收线程发送的数据库访问语句的预编译请求,其中,该终端可以是个人电脑(personal computer,PC)、手机、平板电脑等,该数据访问语句可以是SQL语句,也可以是其他数据库等,该SQL语句访问的数据库可以是关系型数据库(即,分布式数据库),下面仅以对关系型数据库访问语句为SQL语句进行说明。
具体的,由于在终端中一般通过JDBC驱动进行数据库语句的预编译,所以在本申请中,该终端中的JDBC驱动接收线程发送的携带SQL语句的预编译请求。并且,因为该SQL语句为数据库访问语句,所以根据SQL语句的格式要求,该SQL语句中可包含需要访问的数据表的标识,即,数据表标识。
需要说明的是,由于JDBC驱动通常应用在终端中进行数据库语句的预编译,所以本申请针对的是采用JDBC驱动进行数据库语言预编译的方法,并不局限于终端中,当然,由于在服务器端一般由DBMS进行数据库语言预编译,所以在一般场景下,本申请适用在终端中,以下仅以终端为例进行说明。
例如,假设工作人员想要通过PC查询公司分布式数据库中用户名为“官方”的用户,并且在该数据库中用于存储用户名的大数据表已拆分为100个分表,即,存储全部用户名的总表已经拆分为对应的100个分表。则工作人员在通过SQL语句查询该数据库中符合条件的用户名时,该PC的JDBC驱动会接收到线程a发送的100个对SQL语句进行预编译的请求,并且每个SQL语句中包含不同的分表标识,进一步假设,该总表标识为vcc_coucher,拆分出的各分表标识分别为vcc_coucher_00、vcc_coucher_01、vcc_coucher_02……vcc_coucher_99。那么针对第一个分表(即,分表标识为vcc_coucher_00的分表),JDBC驱动会接收到携带SQL语句为select*from vcc_coucher_00whereuser_id=‘官方’的预编译请求,其中数据表标识为分表标识:vcc_coucher_00。
S102:当所述数据表标识为分表标识时,根据预先保存的分表标识与总表标识的对应关系,将所述数据库访问语句中的分表标识替换为对应的总表标识。
由于JDBC驱动的重复预编译行为,是因为JDBC驱动无法识别针对不同分表但结构相同的多个SQL语句,所以在本申请实施例中,当在步骤S101中接收到的SQL语句中的数据表标识为分表标识时,才需要使用本申请提供的方法。
具体的,由于在数据库将大数据表拆分为分表时,通常会有相应的对分表进行命名的规则,可对总表标识与分表标识的对应关系进行记录,所以当该终端需要访问该数据库时,可预先将该数据库中各总表标识与各分表标识的对应关系保存,以便后续访问该数据库。
于是,首先,该JDBC驱动可以根据预先保存的各总表标识与各分表标识的对应关系,判断该SQL语句中包含的数据表标识是否为分表标识,若否,则无需进行后续的替换步骤,可以直接针对该SQL语句进行预编译,若是,则可进行后续步骤。
其次,当确定该SQL语句中包含的数据表标识为分表标识时,可根据预先保存的各分表标识与各总表标识的对应关系,确定与该分表标识对应的总表标识。
最后,则可将该SQL语句中的分表标识替换为对应的总表标识。
并且,由于此时SQL语句中的数据表标识已经替换为总表标识,所以为了方便后续执行SQL语句时,可以针对不同的SQL语句分别还原对应的分表标识,则此时,还可以记录该SQL语句中的分表标识与对应的总表标识之间的替换关系,以便在执行预编译后的SQL语句时,可根据记录的该替换关系,将该预编译后的SQL语句中的总表标识替换为对应的分表标识,再执行。具体的,该替换关系可以记录在发送该预编译请求线程的线程变量中。
需要说明的是,该替换关系也可直接记录在该终端本地,具体记录在何处本申请并不做具体限定。
继续沿用上例,由于该JDBC驱动接收到携带SQL语句为select*fromvcc_coucher_00where user_id=‘官方’的预编译请求,而通过预先保存的分表标识与总表标识的对应规则,可以判断该SQL语句中的数据表标识为分表标识。其中,假设分表标识与总表标识的对应关系如表2所示。
表2
通过表2可见,该数据表标识vcc_coucher_00为分表标识,并且该本表标识对应的总表标识为vcc_coucher,所以可将该SQL语句“select*fromvcc_coucher_00where user_id=“官方”中的分表标识vcc_coucher_00替换为总表标识vcc_coucher,则此时替换后的SQL语句为select*from vcc_coucher whereuser_id=‘官方’。
并且,该JDBC驱动还可将针对该SQL语句的“分表标识vcc_coucher_00替换为总表标识vcc_coucher”的替换关系,记录在该线程a的线程变量中。
S103:对替换后的数据访问语句进行预编译。
在本申请实施例中,当对SQL语句中的数据表标识已经被替换后,JDBC驱动便可对该替换后的SQL语句进行与现有技术中相同的预编译过程。
具体的预编译过程与现有技术一致,即,当JDBC驱动对该替换后的SQL语句进行预编译时,可先根据保存在本地的各预编译SQL语句,判断该替换后的SQL语句是否已经经过预编译(即,判断本地是否保存有与该替换后的SQL语句一致的预编译SQL语句),若是,则可确定该替换后的SQL语句已经经过预编译可以无需再编译,若否,可确定需要对该替换后的SQL语句进行预编译,则此时,该JDBC驱动可对需要进行预编译的该替换后的SQL语句进行解析、检查、编译等预编译过程,并得到与该替换后的SQL语句对应的预编译SQL语句,并将该预编译后的SQL语句存储在本地(如,终端的内存中),以便后续在执行SQL语句时,可以直接调用存储在本地对应的预编译SQL语句,并执行,达到使SQL语句的执行效率提高的目的。
继续沿用上例,该PC中的JDBC驱动,根据本地保存的各预编译后的SQL语句,判断确定本地并没有保存与该替换后的SQL语句一致的预编译SQL语句,于是确定需要对该替换后的SQL语句进行预编译,进一步便可将替换后的SQL语句(具体为:select*from vcc_coucher where user_id=‘官方’)进行预编译过程,并将预编译后的该SQL语句存储在该PC的内存中。
进一步假设,由于该工作人员是希望对所有用户名都进行查询,而该用于存储用户名的大数据表已拆分为100个分表,所以该线程a还存在针对不同分表标识的SQL语句的预编译请求(如,select*from vcc_coucher_01whereuser_id=‘官方’、select*from vcc_coucher_02where user_id=‘官方’……select*from vcc_coucher_99where user_id=‘官方’等等),则此时该PC中的JDBC驱动在经过上述步骤S101和S102之后,会将上述各SQL语句替换为同一个SQL语句:select*from vcc_coucher where user_id=‘官方’,并将对应的替换关系记录在该线程a的线程变量中,所以在预编译该替换后的SQL语句之前,该JDBC驱动都会判断该SQL语句已经经过预编译处理,无需再次进行预编译,减轻了该JDBC驱动的运行压力,以及该PC的存储压力。
通过如图1所示的数据库访问语句编译方法,可见,对数据库访问语句进行预编译之前,先判断该数据库访问语句中的数据表标识是否为分表标识,当该数据表标识为分表标识,跟据预先保存的分表标识与总表标识的对应关系,将该数据库访问语句中的分表标识替换为总表标识,最后再对该替换后的数据库访问语句进行预编译,可见针对同一个总表下不同分表的相同语句结构的数据库访问语句,由于步骤S102的替换过程,使得需要经行预编译的语句可以统一为一个,即,避免了对数据库访问语句的重复预编译,在保证预编译数据库访问语句带来的优点的同时,提高了JDBC驱动的运行效率,减轻了终端的存储压力。
另外,在图1所述的数据库语句编译过程中,仅仅以一个线程为例进行了说明,但是,本方法并不限定单个线程的预编译请求,可以是针对多个线程的预编译请求。由于对于相同结构的SQL语句,通过步骤S102均可替换为相同的SQL语句,所以针对每个具有相同结构的SQL语句的预编译请求,无论该预编译请求是不是由同一个线程发出的,对于JDBC驱动来说,均只需要进行一次预编译即可。
继续沿用上例,假设线程a、线程b、线程c,分别向JDBC驱动发送了相同结构SQL语句的预编译请求,其中,线程a中的SQL语句为select*fromvcc_coucher_01where user_id=‘官方’、线程b中的SQL语句为select*fromvcc_coucher_02where user_id=‘官方’、线程c中的SQL语句为select*fromvcc_coucher_03where user_id=‘官方’。
进一步假设,该JDBC驱动最先接收到线程b的预编译请求,则在经过步骤S102~步骤S103之后,该JDBC驱动会将替换后的SQL语句select*fromvcc_coucher where user_id=‘官方’进行预编译,该线程b仅在线程变量中保存了分表标识vcc_coucher_02替换为总表标识vcc_coucher的替换关系。而当,后续该JDBC驱动接收到线程a、或者线程c的预编译请求时,由于经过步骤S102,该SQL语句均会被替换为select*from vcc_coucher where user_id=‘官方’,而由于该替换后的SQL语句已经在执行线程b的预编译请求过程中进行过预编译,所以该JDBC驱动无需再次执行预编译,该线程a和线程c也仅需在分别在各自的线程变量中记录对应的替换关系即可。
基于图1所示的数据库访问语句编译过程,本申请实施例还对应提供一种数据库语句执过程,如图2所示。
图2是本申请实施例提供一种数据库语句执过程,具体包括以下步骤:
S201:接收待执行数据库访问语句。
一般终端通过JDBC驱动来执行各线程发送的数据库访问语句,于是,在本申请实施例中,终端中的JDBC驱动可接收待执行的数据库访问语句,其中,该终端可以是个人电脑(personal computer,PC)、手机、平板电脑等,该数据访问语句可以是SQL语句,也可以是其他数据库等,该SQL语句访问的数据库可以是关系型数据库(即,分布式数据库),下面仅以该终端接收待执行SQL语句进行说明。
继续沿用上例,假设该工作人员的PC中的JDBC驱动接收到了线程a发送的待执行SQL语句:select*from vcc_coucher_00where user_id=‘官方’。
S202:判断所述待执行数据库访问语句是否存在对应的预编译数据库访问语句,若不存在,则执行步骤S203,若存在,则执行步骤S204。
在本申请实施例中,由于存在对SQL语句的预编译过程,所以JDBC驱动在接收到每个待执行SQL语句时,都需要保存在本地的各预编译SQL语句,判断该待执行SQL语句是否存在对应的预编译SQL语句,以便后续操作。
具体的,由于在步骤S102~S103中已经将预编译的SQL语句中各分表标识替换为总表标识,而JDBC驱动在步骤S201中接收到的还是包含分表标识的待执行SQL语句,所以判断该待执行SQL语句是否存在预编译SQL语句的过程需要分为两步。
首先,JDBC驱动可根据发送该待执行SQL语句的线程中线程变量,确定该待发送SQL语句是否存在替换关系,若存在,则可以进行后续判断,若不存在,则可直接执行步骤S203。
其次,根据该替换关系中的总表标识,判断是否存在对应该总表标识的预编译SQL语句,若是,则执行步骤S204,若否则执行步骤S203。具体的,该JDBC驱动可以调用本地保存的各预编译SQL语句,根据各预编译SQL语句,查找是否存在既包含该总表标识又与该待执行SQL语句结构相同的预编译SQL语句,若存在则执行步骤S204,若不存在则执行步骤S203。
继续沿用上例,假设JDBC驱动跟据该线程a中的线程变量,确定该待执行SQL语句中存在替换关系,先确定该替换关系为将分表标识vcc_coucher_00替换为总表标识vcc_coucher,那么就可以根据其中的总表标识vcc_coucher以及该地执行SQL语句的结构select*from数据表标识where user_id=‘官方’,查找本地保存的各预编译SQL语句中是否存在既包含总表标识vcc_coucher、SQL语句结构又为select*from数据表标识where user_id=‘官方’的预编译SQL语句。
进一步假设,该JDBC驱动,找到了预编译SQL语句select*fromvcc_coucher where user_id=‘官方’,其中包含总表标识vcc_coucher,其语句结构也为elect*from数据表标识where user_id=‘官方’,则判断存在与该待执行SQL语句对应的预编译SQL语句,需要执行步骤S204。
S203:对所述待执行数据库访问语句进行预编译后,执行预编译后的数据库访问语句。
在本申请实施例中,若该待执行SQL语句没有对应的预编译SQL语句,那么除了直接对该待执行SQL语句进行编译并执行以外,在本申请中,还以将该待执行SQL语句的编译结果,作为预编译SQL语句进行保存,并执行预编译后的SQL语句,以便后续再次执行该待执行SQL语句时,可直接调用对应的预编译SQL语句并执行。
继续沿用上例,假设,在步骤S202中,判断该待执行SQL语句不存在对应的预编译SQL语句,则,该JDBC驱动在对该待执行SQL语句进行编译后,将已编译的该待执行SQL语句,作为预编译SQL语句存储,并执行该预编译SQL语句。
S204:根据预先记录的所述待执行数据库访问语句对应的替换关系,将所述待执行数据库访问语句对应的预编译数据访问语句中的总表标识替换为对应的分表标识,再执行替换后的预编译数据库访问语句。
在本申请实施例中,若该待执行SQL语句存在对应的预编译SQL语句,则此时,该JDBC驱动可先调取该待执行SQL语句对应的预编译SQL语句,再根据在步骤S202中确定的与该待执行数据库访问语句对应的替换关系,将该预编译SQL语句中的总表标识替换为对应的分表标识,最后直接执行替换后的预编译SQL语句。
具体的,该JDBC驱动,可先调取该待执行SQL语句对应的预编译SQL语句以及记录在发送该待执行SQL语句的线程中线程变量中的替换关系,之后再根据该替换关系中总表标识与分表标识的对应关系,将该待执行SQL语句对应的预编译SQL语句中的总表标识替换为对应的分表标识,最后直接执行替换后的预编译SQL语句。
继续沿用上例,该JDBC驱动将该待执行SQL语句select*fromvcc_coucher_00where user_id=‘官方’对应的预编译SQL语句select*fromvcc_coucher where user_id=‘官方’调取出来,再根据该线程a的线程变量中记录的替换关系,将该预编译SQL语句中的总表标识vcc_coucher替换为分表标识vcc_coucher_00,最后替换后的预编译SQL语句。
通过图2所示的数据库语句执方法,若该待执行数据库访问语句存在对应的预编译数据库访问语句,则可以根据预先记录的该待执行数据库访问语句对应的替换关系,将该待执行数据库访问语句对应的预编译数据访问语句中的总表标识替换为对应的分表标识,再执行替换后的预编译数据库访问语句,由于图1所示的编译过程中,针对每个分表的相同结构的数据库访问语句,JBDC驱动都预编译为同一个预编译数据库访问语句,所以在执行各分表具有相同结构的待执行数据库访问语句时,仅需要对与该待执行数据库访问语句对应的预编译数据库访问语句进行一次总表标识替换为分表标识的过程,就相当于实现了对该待执行数据库访问语句的预编译,使得JDBC驱动可以直接执行该替换后的预编译数据库访问语句,保证了数据库访问语句的执行效率的同时,减少了终端的存储压力。
基于图1所示的数据库语句编译过程,本申请实施例还提供一种数据库语句编译装置,如图3所示。
图3是本申请实施例提供一种数据库语句编译装置的结构示意图,具体包括:
接收模块301,用于接收携带数据库访问语句的预编译请求,其中所述数据库访问语句中包含数据表标识;
替换模块302,用于当所述数据表标识为分表标识时,根据预先保存的分表标识与总表标识的对应关系,将所述数据库访问语句中的分表标识替换为对应的总表标识;
编译模块303,用于对替换后的数据访问语句进行预编译。
所述替换模块302还用于,记录所述数据库访问语句中的分表标识与对应的总表标识之间的替换关系,以便在执行预编译后的数据库访问语句时,根据所述替换模块302记录的所述替换关系,将所述预编译后的数据库访问语句中的总表标识替换为对应的分表标识,再执行。
所述接收模块301具体用于,接收线程发送的携带数据库访问语句的预编译请求。
所述替换模块302具体用于,将所述替换关系记录在所述线程的线程变量中。
具体的,上述如图3所示的数据库语句编译装置可以位于终端中,该终端可以是手机、平板电脑或者PC。
基于图2所示的数据库语句执行过程,本申请实施例还提供一种数据库语句执行装置,如图4所示。
图4是本申请实施例提供一种数据库语句执行装置的结构示意图,具体包括:
接收模块401,用于接收待执行数据库访问语句;
判断执行模块402,用于判断所述待执行数据库访问语句是否存在对应的预编译数据库访问语句,若不存在,则对所述待执行数据库访问语句进行预编译后,执行预编译后的数据库访问语句,若存在,则根据预先记录的所述待执行数据库访问语句对应的替换关系,将所述待执行数据库访问语句对应的预编译数据访问语句中的总表标识替换为对应的分表标识,再执行替换后的预编译数据库访问语句。
所述接收模块401具体用于,接收线程发送的待执行数据库访问语句,所述判断执行模块402具体用于,根据记录在所述线程的线程变量中的替换关系,将所述待执行数据库访问语句对应的预编译数据库访问语句中的总表标识替换为对应的分表标识。
具体的,上述如图3所示的数据库语句编译装置可以位于终端中,该终端可以是手机、平板电脑或者PC。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。