CN107220265A - 一种数据库语句编译和执行方法及装置 - Google Patents

一种数据库语句编译和执行方法及装置 Download PDF

Info

Publication number
CN107220265A
CN107220265A CN201610166665.9A CN201610166665A CN107220265A CN 107220265 A CN107220265 A CN 107220265A CN 201610166665 A CN201610166665 A CN 201610166665A CN 107220265 A CN107220265 A CN 107220265A
Authority
CN
China
Prior art keywords
statement
precompile
database access
database
access statement
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
Application number
CN201610166665.9A
Other languages
English (en)
Other versions
CN107220265B (zh
Inventor
唐强
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Advanced New Technologies Co Ltd
Advantageous New Technologies Co Ltd
Original Assignee
Alibaba Group Holding Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN201610166665.9A priority Critical patent/CN107220265B/zh
Publication of CN107220265A publication Critical patent/CN107220265A/zh
Application granted granted Critical
Publication of CN107220265B publication Critical patent/CN107220265B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2455Query execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请实施例提供一种数据库语句编译和执行方法及装置,该方法当接收的预编译请求中数据库语句包含的数据表标识为分表标识时,根据预先保存的分表标识与总表标识的对应关系,将该数据库语句中的分表标识替换为总表标识,并进行预编译。当接收到待执行数据库访问语句时,先确定对应的预编译数据库访问语句,再根据预先记录该待执行数据库访问语句对应的替换关系,将该待执行数据库访问语句对应的预编译数据库访问语句中的总表标识替换为分表标识,并执行。通过上述方法,统一针对分表标识的数据库语句的预编译过程,使得在数据库语句编译和执行过程中,终端耗费的资源更少,效率更高。

Description

一种数据库语句编译和执行方法及装置
技术领域
本申请涉及信息技术领域,尤其涉及一种数据库语句编译和执行方法及装置。
背景技术
随着信息化社会的发展,人们越来越依赖于数据库进行大量数据的存储,而数据库技术也成为大数据时代的基石,成为一直以来人们关注的重点。
其中,在关系型数据库中,一般采用结构化查询语言(Structured QueryLanguage,SQL)存取数据以及查询、更新和管理关系数据库系统。一般情况下,数据库管理系统(Database Management System,DBMS)在接收到一个SQL语句时,需要先进行一个编译过程:解析该SQL语句、检查该SQL语句的语法和语义以及该SQL语句的生成代码,而通常该编译过程所需的时间要比DBMS执行该SQL语句所需要的时间长。
然而,当一个SQL语句反复出现时(如,SQL语句出现在for或者while循环中时),该DBMS需要反复编译该SQL语句并执行该SQL语句,从而导致数据库系统的整体效率降低。于是,在现有技术中,人们采用对SQL语句进行预编译的方法。解决这一问题。
具体的,在创建Java编程语言的应用程序接口PreparedStatement(其中,PreparedStatement是java.sql中的一个接口,它是Statement的子接口)对象时(PreparedStatement对象是用于访问和处理存储在数据库中数据的),将指定需要预编译的SQL语句发送给DBMS进行解析、检查、编译等预编译过程,并将该预编译后的SQL语句存储在本地(具体可存储在本地内存中,该本地内存称为:数据库缓冲池)。当DBMS接收到待执行的SQL语句后,该DBMS可以通过从本地内存保存的若干已预编译的SQL语句中,判断该待执行的SQL语句是否已经经过预编译,若是,则无需再次进行编译,可直接执行本地保存的对应的预编译SQL语句,若不是,则可对该待执行的SQL语句进行预编译后,并将预编译后的SQL语句同样存储在本地,再执行该预编译后的SQL语句。
通过上述预编译过程可见,即使一个SQL语句反复出现,DBMS也无需重复执行编译的过程,可直接在本地查找并执行预编译后的SQL语句,解决了重复编译SQL语句带来的数据库系统效率降低的问题。
更进一步的,除了在服务器端进行SQL语言的预编译,在终端也可以进行SQL语句预编译,具体是通过java数据库连接(Java Data Base Connectivity,JDBC)驱动完成的。但是,在JDBC驱动中进行终端SQL语句预编译时,JDBC驱动无法识别针对不同分表但结构相同的多个SQL语句,这就导致若这些SQL语句需要访问的是将大数据表进行水平拆分后的若干分表时,虽然每个分表的结构完全一致,但由于每个分表的标识不一致,因此JDBC驱动仍会对这些SQL语句分别进行预编译。这不仅导致JBDC驱动进行重复的SQL语句预编译,影响SQL语句的执行效率,同时也会占用大量的内存,进而影响终端整体运行效率。
例如,假设,某关系型数据库中的一张总表标识为vcc_coucher,并针对该总表存在一条SQL语句,如,select*from vcc_coucher where user_id=“?”,那么此时JDBC驱动只需对这一条SQL语句进行预编译即可。进一步假设,当该总表被拆分成100个分表,并且各分表标识分别为vcc_coucher_00、vcc_coucher_01、vcc_coucher_02……vcc_coucher_99,那么针对同一条SQL语句,由于各分表标识均不同,而JDBC驱动无法识别结构相同的SQL语句,所以JDBC驱动需要分别对100条SQL语句进行预编译,如表1所示。
表1
通过表1可见,JDBC驱动针对多个SQL语句,如果这些SQL语句访问的是出自同一大数据表的不同分表,那么这些SQL语句实际上的结构都是一致的,仅仅是数据表标识不一致。而JDBC驱动需要重复的预编译这些SQL语句,增大了终端预编译SQL语句的压力、同时也增加了终端的内存压力。
可见现有技术中,在终端进行SQL语句预编译的方法,可导致终端内存中存储大量的预编译SQL语句,不仅导致内存使用率高,同时也影响了SQL语句的执行效率。
发明内容
本申请实施例提供一种数据库语句编译和访问方法及装置,用以解决现有数据库语句编译和访问方法,对文档集或语料集进行分析确定的主题可理解性低,导致需要重复分析文档,影响文档分析效率的问题。
本申请实施例提供的一种数据库语句编译方法,包括:
接收携带数据库访问语句的预编译请求,其中所述数据库访问语句中包含数据表标识;
当所述数据表标识为分表标识时,根据预先保存的分表标识与总表标识的对应关系,将所述数据库访问语句中的分表标识替换为对应的总表标识;
对替换后的数据访问语句进行预编译。
本申请实施例提供的一种数据库语句执行方法,包括:
接收待执行数据库访问语句;
确定所述待执行数据库访问语句对应的预编译数据库访问语句;
判断是否存在对应所述待执行数据库访问语句的替换关系;
若不存在,则执行所述预编译数据库访问语句;
若存在,则根据预先记录的所述待执行数据库访问语句对应的替换关系,将所述待执行数据库访问语句对应的预编译数据访问语句中的总表标识替换为对应的分表标识,再执行替换后的预编译数据库访问语句。
本申请实施例提供的一种数据库语句编译装置,包括:
接收模块,用于接收携带数据库访问语句的预编译请求,其中所述数据库访问语句中包含数据表标识;
替换模块,用于当所述数据表标识为分表标识时,根据预先保存的分表标识与总表标识的对应关系,将所述数据库访问语句中的分表标识替换为对应的总表标识;
编译模块,用于对替换后的数据访问语句进行预编译。
本申请实施例提供的一种数据库语句执行装置,包括:
接收模块,用于接收待执行数据库访问语句;
确定模块,用于确定所述待执行数据库访问语句对应的预编译数据库访问语句;
判断执行模块,用于判断是否存在对应所述待执行数据库访问语句的替换关系,若不存在,则执行所述预编译数据库访问语句,若存在,则根据预先记录的所述待执行数据库访问语句对应的替换关系,将所述待执行数据库访问语句对应的预编译数据访问语句中的总表标识替换为对应的分表标识,再执行替换后的预编译数据库访问语句。
本申请实施例提供一种数据库语句编译和执行方法及装置,该方法当接收的预编译请求中数据库语句包含的数据表标识为分表标识时,根据预先保存的分表标识与总表标识的对应关系,将该数据库语句中的分表标识替换为总表标识,并进行预编译。当接收到待执行数据库访问语句时,先判断该待执行数据库访问语句是否存在对应的预编译数据库访问语句,若否,则对该待执行数据库访问语句进行预编译后再执行,若是,则根据预先记录的该待执行数据库访问语句对应的替换关系,将该待执行数据库访问语句对应的预编译数据访问语句中的总表标识替换为对应的分表标识,再执行替换后的预编译数据库访问语句。通过上述方法,统一针对分表标识的数据库语句的预编译过程,使得在数据库语句编译和执行过程中,终端耗费的资源更少,效率更高。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请实施例提供的数据库语句编译过程;
图2是本申请实施例提供一种数据库语句执过程;
图3是本申请实施例提供一种数据库语句编译装置的结构示意图;
图4是本申请实施例提供一种数据库语句执行装置的结构示意图。
具体实施方式
在本申请实施例中,对数据库语句的编译过程为:接收携带数据库访问语句的预编译请求,当该数据库访问语句中包含的数据表标识为分表标识时,根据预先保存的分表标识与总表标识的对应关系,将该数据库访问语句中的分表标识替换为总表标识,最后对替换后的数据库访问语句进行预编译。对应的对数据库语句的执行过程为:接收待执行数据库访问语句,先判断该待执行数据库访问语句是否存在对应的预编译数据库访问语句,若否,则对该待执行数据库访问语句进行预编译后再执行,若是,则根据预先记录的该待执行数据库访问语句对应的替换关系,将该待执行数据库访问语句对应的预编译数据访问语句中的总表标识替换为对应的分表标识,再执行替换后的预编译数据库访问语句。可见本申请所述的方法,在进行数据库访问语句的预编译时,当该数据库访问语句中数据表标识是分表标识时,针对每个分表的结构相同的数据库访问语句,只需一次预编译即可,无需重复进行编译。并且,在执行对应各分表的待执行数据库访问语句时,可以根据对应的替换关系,将预编译数据库语句中的总表标识替换为对应的分表标识,并执行。可见,在使用本申请的方法进行数据库语句编译和执行时,既达到了预编译数据库语句可以提高数据库语句执行效率的效果,同时也避免了现有技术中重复预编译的缺点,降低了对预编译数据库语句的存储压力,提高了数据库语言的执行效率。
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图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、光学存储器等)上实施的计算机程序产品的形式。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

Claims (10)

1.一种数据库语句编译方法,其特征在于,所述方法包括:
接收携带数据库访问语句的预编译请求,其中所述数据库访问语句中包含数据表标识;
当所述数据表标识为分表标识时,根据预先保存的分表标识与总表标识的对应关系,将所述数据库访问语句中的分表标识替换为对应的总表标识;
对替换后的数据访问语句进行预编译。
2.如权利要求1所述的方法,其特征在于,将所述数据库访问语句中的分表标识替换为对应的总表标识之后,所述方法还包括:
记录所述数据库访问语句中的分表标识与对应的总表标识之间的替换关系,以便在执行预编译后的数据库访问语句时,根据记录的所述替换关系,将所述预编译后的数据库访问语句中的总表标识替换为对应的分表标识,再执行。
3.如权利要求2所述的方法,其特征在于,接收携带数据库访问语句的预编译请求,具体包括:
接收线程发送的携带数据库访问语句的预编译请求;
记录所述数据库访问语句中的分表标识与对应的总表标识之间的替换关系,具体包括:
将所述替换关系记录在所述线程的线程变量中。
4.一种数据库语句执行方法,其特征在于,具体包括:
接收待执行数据库访问语句;
判断所述待执行数据库访问语句是否存在对应的预编译数据库访问语句;
若不存在,则对所述待执行数据库访问语句进行预编译后,执行预编译后的数据库访问语句;
若存在,则根据预先记录的所述待执行数据库访问语句对应的替换关系,将所述待执行数据库访问语句对应的预编译数据访问语句中的总表标识替换为对应的分表标识,再执行替换后的预编译数据库访问语句。
5.如权利要求4所述的方法,其特征在于,接收待执行数据库访问语句,具体包括:
接收线程发送的待执行数据库访问语句;
根据预先记录的所述待执行数据库访问语句对应的替换关系,将所述待执行数据库访问语句对应的预编译数据访问语句中的总表标识替换为对应的分表标识,具体包括:
根据记录在所述线程的线程变量中的替换关系,将所述待执行数据库访问语句对应的预编译数据库访问语句中的总表标识替换为对应的分表标识。
6.一种数据库语句编译装置,其特征在于,包括:
接收模块,用于接收携带数据库访问语句的预编译请求,其中所述数据库访问语句中包含数据表标识;
替换模块,用于当所述数据表标识为分表标识时,根据预先保存的分表标识与总表标识的对应关系,将所述数据库访问语句中的分表标识替换为对应的总表标识;
编译模块,用于对替换后的数据访问语句进行预编译。
7.如权利要求6所述的装置,其特征在于,所述替换模块还用于,记录所述数据库访问语句中的分表标识与对应的总表标识之间的替换关系,以便在执行预编译后的数据库访问语句时,根据所述替换模块记录的所述替换关系,将所述预编译后的数据库访问语句中的总表标识替换为对应的分表标识,再执行。
8.如权利要求7所述的装置,其特征在于,所述接收模块具体用于,接收线程发送的携带数据库访问语句的预编译请求,所述替换模块具体用于,将所述替换关系记录在所述线程的线程变量中。
9.一种数据库语句执行装置,其特征在于,具体包括:
接收模块,用于接收待执行数据库访问语句;
判断执行模块,用于判断所述待执行数据库访问语句是否存在对应的预编译数据库访问语句,若不存在,则对所述待执行数据库访问语句进行预编译后,执行预编译后的数据库访问语句,若存在,则根据预先记录的所述待执行数据库访问语句对应的替换关系,将所述待执行数据库访问语句对应的预编译数据访问语句中的总表标识替换为对应的分表标识,再执行替换后的预编译数据库访问语句。
10.如权利要求9所述的装置,其特征在于,所述接收模块具体用于,接收线程发送的待执行数据库访问语句,所述判断执行模块具体用于,根据记录在所述线程的线程变量中的替换关系,将所述待执行数据库访问语句对应的预编译数据库访问语句中的总表标识替换为对应的分表标识。
CN201610166665.9A 2016-03-22 2016-03-22 一种数据库语句编译和执行方法及装置 Active CN107220265B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610166665.9A CN107220265B (zh) 2016-03-22 2016-03-22 一种数据库语句编译和执行方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610166665.9A CN107220265B (zh) 2016-03-22 2016-03-22 一种数据库语句编译和执行方法及装置

Publications (2)

Publication Number Publication Date
CN107220265A true CN107220265A (zh) 2017-09-29
CN107220265B CN107220265B (zh) 2020-09-25

Family

ID=59928080

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610166665.9A Active CN107220265B (zh) 2016-03-22 2016-03-22 一种数据库语句编译和执行方法及装置

Country Status (1)

Country Link
CN (1) CN107220265B (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111858638A (zh) * 2020-07-29 2020-10-30 上海真兰仪表科技股份有限公司 一种大批量同质数据的批量入库方法
CN112069173A (zh) * 2020-08-24 2020-12-11 北京首汽智行科技有限公司 一种数据动态分表方法
CN116610705A (zh) * 2023-07-20 2023-08-18 金篆信科有限责任公司 分布式数据库预编译管理方法、装置、设备及存储介质

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1419192A (zh) * 2001-10-31 2003-05-21 亚普公司 中间代码预处理、执行装置及执行系统及计算机程序产品
US20060294088A1 (en) * 2005-06-27 2006-12-28 International Business Machines Corporation Method, system, and computer program product for caching dynamically generated queries
CN101425060A (zh) * 2007-11-02 2009-05-06 英业达股份有限公司 数据库的数据表生成方法
CN102521409A (zh) * 2011-12-28 2012-06-27 北京人大金仓信息技术股份有限公司 一种基于通信协议的数据库数据批量更新方法
CN103020193A (zh) * 2012-12-03 2013-04-03 北京奇虎科技有限公司 处理数据库操作请求的方法和设备
CN105930387A (zh) * 2016-04-14 2016-09-07 北京思特奇信息技术股份有限公司 一种基于数据路由、分库分表的数据操作系统及方法

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1419192A (zh) * 2001-10-31 2003-05-21 亚普公司 中间代码预处理、执行装置及执行系统及计算机程序产品
US20060294088A1 (en) * 2005-06-27 2006-12-28 International Business Machines Corporation Method, system, and computer program product for caching dynamically generated queries
CN101425060A (zh) * 2007-11-02 2009-05-06 英业达股份有限公司 数据库的数据表生成方法
CN102521409A (zh) * 2011-12-28 2012-06-27 北京人大金仓信息技术股份有限公司 一种基于通信协议的数据库数据批量更新方法
CN103020193A (zh) * 2012-12-03 2013-04-03 北京奇虎科技有限公司 处理数据库操作请求的方法和设备
CN105930387A (zh) * 2016-04-14 2016-09-07 北京思特奇信息技术股份有限公司 一种基于数据路由、分库分表的数据操作系统及方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
PPBY2002: "MyBatis,动态传入表名,字段名的解决办法", 《HTTP://LUOYU-DS.ITEYE.COM/BLOG/1517607》 *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111858638A (zh) * 2020-07-29 2020-10-30 上海真兰仪表科技股份有限公司 一种大批量同质数据的批量入库方法
CN112069173A (zh) * 2020-08-24 2020-12-11 北京首汽智行科技有限公司 一种数据动态分表方法
CN116610705A (zh) * 2023-07-20 2023-08-18 金篆信科有限责任公司 分布式数据库预编译管理方法、装置、设备及存储介质

Also Published As

Publication number Publication date
CN107220265B (zh) 2020-09-25

Similar Documents

Publication Publication Date Title
CN107038207B (zh) 一种数据查询方法、数据处理方法及装置
CN106547796B (zh) 数据库的执行方法及装置
US8700605B1 (en) Estimating rows returned by recursive queries using fanout
CN103902653B (zh) 一种构建数据仓库表血缘关系图的方法和装置
CN102270225B (zh) 数据变更日志监控方法和数据变更日志监控装置
Vajk et al. Denormalizing data into schema-free databases
CN106407303A (zh) 数据存储、查询方法及装置
US20210286795A1 (en) Database index and database query processing method, apparatus, and device
CN104331446A (zh) 一种基于内存映射的海量数据预处理方法
CN112230934B (zh) 一种转换代码语言的方法及装置
CN106897342A (zh) 一种数据校验方法和设备
CN107220265A (zh) 一种数据库语句编译和执行方法及装置
CN107704511A (zh) 一种sql优化方法及设备
CN112417225A (zh) 一种多源异构数据的联合查询方法与系统
CN107346317A (zh) 一种数据查询方法和装置
CN109582476B (zh) 数据处理方法、装置及系统
CN114297204A (zh) 一种异构数据源的数据存储、检索方法及装置
CN116303628B (zh) 基于Elasticsearch的告警数据查询方法、系统及设备
CN113312373A (zh) 一种数据结构化查询语句的解析方法及设备
CN111125090B (zh) 数据存取方法及装置
CN117033181A (zh) 一种测试用例生成的方法、装置及设备
CN112463814A (zh) 一种数据查询方法及装置
CN109753533A (zh) 一种多源关系型数据库客户端开发方法及装置
US10423599B2 (en) Global and local temporary database tables
CN114925142A (zh) 一种orm框架的多类型数据库兼容方法、装置、设备及介质

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
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20201013

Address after: Cayman Enterprise Centre, 27 Hospital Road, George Town, Grand Cayman Islands

Patentee after: Innovative advanced technology Co.,Ltd.

Address before: Cayman Enterprise Centre, 27 Hospital Road, George Town, Grand Cayman Islands

Patentee before: Advanced innovation technology Co.,Ltd.

Effective date of registration: 20201013

Address after: Cayman Enterprise Centre, 27 Hospital Road, George Town, Grand Cayman Islands

Patentee after: Advanced innovation technology Co.,Ltd.

Address before: A four-storey 847 mailbox in Grand Cayman Capital Building, British Cayman Islands

Patentee before: Alibaba Group Holding Ltd.