CN116204546A - Sql预编译方法、装置、服务器和存储介质 - Google Patents
Sql预编译方法、装置、服务器和存储介质 Download PDFInfo
- Publication number
- CN116204546A CN116204546A CN202111461115.7A CN202111461115A CN116204546A CN 116204546 A CN116204546 A CN 116204546A CN 202111461115 A CN202111461115 A CN 202111461115A CN 116204546 A CN116204546 A CN 116204546A
- Authority
- CN
- China
- Prior art keywords
- precompiled
- global
- sql
- memory
- target
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 47
- 238000013507 mapping Methods 0.000 claims description 14
- 238000004590 computer program Methods 0.000 claims description 6
- 238000001514 detection method Methods 0.000 claims description 4
- 230000008569 process Effects 0.000 description 7
- 238000010586 diagram Methods 0.000 description 6
- 238000005457 optimization Methods 0.000 description 4
- 230000000903 blocking effect Effects 0.000 description 3
- 230000008901 benefit Effects 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 230000006870 function Effects 0.000 description 2
- 230000007849 functional defect Effects 0.000 description 2
- 238000002347 injection Methods 0.000 description 2
- 239000007924 injection Substances 0.000 description 2
- 238000007726 management method Methods 0.000 description 2
- 230000002093 peripheral effect Effects 0.000 description 2
- 239000000243 solution Substances 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000010187 selection method Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2452—Query translation
- G06F16/24528—Standardisation; Simplification
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Mathematical Physics (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请实施例涉及数据库领域技术领域,特别涉及一种SQL预编译方法、装置、服务器和存储介质。上述SQL预编译方法,包括:获取SQL预编译请求,其中,所述SQL预编译请求中携带有预编译语句;检测全局内存中是否存在与所述预编译语句对应的全局预编译对象;在存在与所述预编译语句对应的全局预编译对象的情况下,向客户端返回预编译成功指令;在不存在与所述预编译语句对应的全局预编译对象的情况下,根据所述预编译语句,创建全局预编译对象,并使用所述创建的全局预编译对象进行预编译。本申请实施例提供的SQL预编译方法,旨在显著降低内存空间占用的情况下,同时做到数据库性能的提升。
Description
技术领域
本申请实施例涉及数据库领域,特别涉及一种SQL预编译方法、装置、服务器和存储介质。
背景技术
数据库接受到SQL语句之后,需要词法和语义解析,SQL语句优化与执行计划制定,执行并返回结果。但是,在数据库应用程序中,很多时候一条SQL语句可能会反复执行,或者每次执行的时候只有个别的值不同,如果每次都需要进行词法语义解析、语句优化、制定执行计划等,SQL语句执行的效率会明显降低。SQL预编译语句就是将SQL语句中的值用占位符替代,可以视为将SQL语句模板化或者说参数化。SQL预编译可做到一次编译,多次运行,避免了反复做相同的硬解析工作,省去了解析优化等过程,提升了执行效率;另一方面,也可有效防止SQL注入式攻击。
数据库系统作为服务端可以与各客户端建立链路(session),数据库系统会在服务端为每个链路(session)均新建与预编译语句对应的预编译对象(Prepare对象),将Prepare对象作为服务端进行预编译时,所依托的数据结构。
然而,上述方式中的服务端内存中可能存在大量相同的Prepare对象,进而使得内存占用量巨大。
这种巨大的内存占用浪费了物理资源,一方面成为制约数据库并发访问能力的瓶颈,另一方面可能引起物理内存不足导致服务器卡顿或崩溃。
发明内容
本申请实施例的主要目的在于提出一种SQL预编译方法、装置、服务器和存储介质,减小服务端内存占用,避免因服务端巨大的内存占用制约数据库并发访问能力,以及减少因无力内存不足导致的服务器卡顿或崩溃。
为实现上述目的,本申请实施例提供了一种SQL预编译方法,包括:获取SQL预编译请求,其中,所述SQL预编译请求中携带有预编译语句;检测全局内存中是否存在与所述预编译语句对应的全局预编译对象;在存在与所述预编译语句对应的全局预编译对象的情况下,向客户端返回预编译成功指令;在不存在与所述预编译语句对应的全局预编译对象的情况下,根据所述预编译语句,创建全局预编译对象,并使用所述创建的全局预编译对象进行预编译。
为实现上述目的,本申请实施例还提供一种SQL预编译装置,包括:获取模块,用于获取SQL预编译请求,其中,所述预编译请求中携带有预编译语句;检测模块,用于检测全局内存中是否存在与所述预编译语句对应的全局预编译对象;预编译模块,用于在存在与所述预编译语句对应的全局预编译对象情况下,向客户端返回预编译成功指令;在不存在与所述预编译语句对应的全局预编译对象的情况下,根据所述预编译语句,创建全局预编译对象,并使用所述创建的全局预编译对象进行预编译。
为实现上述目的,本申请实施例还提供了一种服务器,包括:至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行上述的SQL预编译方法。
为实现上述目的,本申请实施例还提供了一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现上述的SQL预编译方法。
本申请的实施例在全局内存中创建预编译对象是全局的,从而使得创建的全局预编译对象在不同链路间和链路内均可被访问,且,本申请的实施例实施例当存在与预编译语句对应的全局编译对象时,可向客户端返回预编译成功指令,无需基于该预编译请求所属的链路新建一个预编译对象(Prepare对象)进行预编译,实现了链路间和链路内预编译对象的复用,克服了数据库系统中Prepare对象无法复用或者仅能有限复用的功能缺陷,显著减少了因重复的预编译对象Prepare对象引发的内存空间占用,节约了物理内存资源,从而,避免因服务端巨大的内存占用制约数据库并发访问能力,以及减少因物理内存不足导致的服务器卡顿或崩溃。
附图说明
图1是根据本申请一个实施例的SQL预编译方法的流程图;
图2是根据本申请一个实施例中提供的全局内存数据结构的示意图一;
图3是根据本申请一个实施例中提供的全局内存数据结构的示意图二;
图4是根据本申请一个实施例中提供的全局内存数据结构的示意图三;
图5是根据本申请一个实施例提供的全局内存数据结构的示意图四;
图6是根据本申请一个实施例中提供的一种对预编译对象进行操作的流程图;
图7是根据本申请另一个实施例的SQL预编译装置的示意图;
图8是根据本申请另一个实施例的电子设备的结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合附图对本申请的各实施例进行详细的阐述。然而,本领域的普通技术人员可以理解,在本申请各实施例中,为了使读者更好地理解本申请而提出了许多技术细节。但是,即使没有这些技术细节和基于以下各实施例的种种变化和修改,也可以实现本申请所要求保护的技术方案。以下各个实施例的划分是为了描述方便,不应对本申请的具体实现方式构成任何限定,各个实施例在不矛盾的前提下可以相互结合相互引用。
数据库系统处理结构化查询语言(Structured Query Language,SQL)语句的过程包括以下阶段:词法和语义解析,SQL语句优化与执行计划制定,执行并返回结果。其中“词法和语义解析”阶段称为硬解析。在一条SQL语句可能会被反复执行,或者每次执行的时候只有个别的值不同,比如select语句中的where子句值不同,update语句中的set子句值不同等。如果每次都经过完整的SQL语句处理过程,则多做了很多重复的硬解析工作,影响执行效率。
SQL预编译语句就是将SQL语句中的值用占位符替代,可以视为将SQL语句模板化或者说参数化,一般称预编译语句也可称为Prepared Statement。SQL预编译可做到一次编译,多次运行,避免了反复做相同的硬解析工作,省去了解析优化等过程,提升了执行效率;另一方面,也可有效防止SQL注入式攻击。SQL预编译具有如上优势,使得绝大部分的数据库应用程序均使用预编译的方式来访问数据库。SQL预编译被广泛使用,目前常用的数据库系统也均支持SQL预编译,比如MySQL、PostgreSQL、Oracle等。
目前,SQL预编译都是session级别(链路级别)的,即当前session创建的预编译对象,只能当前session使用。也就是说,绝大部分数据库系统是在服务端为每个session的预编译语句均新建与该预编译语句对应预编译对象(Prepare对象),将预编译对象作为预编译语句在服务端处理依托的数据结构。然而,这会导致若在多个链路存在相同的预编译语句时,例如,链路1、链路2、链路3均存在预编译语句1,服务端仍然会创建相同数量的Prepare对象与之一一对应,例如,创建3个相同的预编译对象分别与链路1、链路2、链路3对象,即服务端Prepare对象完全没有复用,所以服务端内存中可能存在大量相同的Prepare对象,进而使得内存占用量巨大。这种巨大的内存占用浪费了物理资源,一方面成为制约数据库并发访问能力的瓶颈,另一方面可能引起物理内存不足导致服务器卡顿或崩溃。
只有少数的数据库系统,如Oracle做了有限的改进:在session内若有多个相同SQL语句的Prepared Statement,则在服务端可只需要创建一个Prepare对象,但这只是在session内复用Prepare对象;不同session间若有SQL语句相同的预编译语句,在服务端仍不可复用,所以大量相同的Prepare对象占用内存的问题仍未有效解决。
鉴于此,本申请的一个实施例涉及一种SQL预编译方法,可应用于服务端,如服务器等设备。本实施例的SQL预编译方法包括:获取SQL预编译请求,其中,所述预编译请求中携带有预编译语句;检测全局内存中是否存在与所述预编译语句对应的全局预编译对象;在存在与所述预编译语句对应的全局预编译对象的情况下,则向客户端返回预编译成功指令;在不存在与所述预编译语句对应的全局预编译对象的情况下,根据所述预编译语句,创建全局预编译对象,并使用所述创建的全局预编译对象进行预编译。
本实施例在全局内存中创建预编译对象是全局的,从而使得创建的全局预编译对象在不同链路间和链路内均可被访问,且,本实施例当存在与预编译语句对应的全局编译对象时,向客户端返回预编译成功指令,无需基于该预编译请求所属的链路新建一个预编译对象(Prepare对象)进行预编译,使得该链路可使用已经存在的全局预编译对象进行执行等相关操作,实现了链路间和链路内预编译对象的复用,克服了数据库系统中Prepare对象无法复用或者仅能有限复用的功能缺陷,显著减少了因重复的预编译对象Prepare对象引发的内存空间占用,节约了物理内存资源,从而,避免因服务端巨大的内存占用制约数据库并发访问能力,以及减少因物理内存不足导致的服务器卡顿或崩溃。
下面对本实施例的SQL预编译方法的实现细节进行具体的说明,以下内容仅为方便理解提供的实现细节,并非实施本方案的必须。
本实施例的预编译方法的具体流程可以如图1所示,包括:
步骤101,获取SQL预编译请求。其中,SQL预编译请求(Prepare请求)中携带有预编译语句。
预编译语句为模板化或参数化的SQL语句,可以使用占位符,如“?”代替参数,将参数与SQL语句分离出来。例如,insert into user(id,password,name,email,address)values(?,?,?,?,?)可以为预编译语句。预编译语句可以通过MD5值标识,可以通过预编译语句的MD5值是否相同判断预编译语句是否相同。
步骤102检测全局内存中是否存在与预编译语句对应的全局预编译对象。本实施例中将预编译对象设计为全局的,以便与服务端产生链路(session)的客户端均能访问该预编译对象。
示例性的,在MySQL数据库中,预编译对象可以为Preparedstatement对象。值得一提的是,在不同数据库中,预编译对象的具体名称可能会不同,本实施例的SQL预编译方法可应用于多种数据库,对于具体的预编译对象名称,本实施例不做限定。
在一些实施例中,在接收到预编译请求之后,在检测全局内存之前,对全局内存加锁,找到与预编译语句对应的全局预编译对象之后,可对释放对全局内存加的锁。通过对全局内存加锁,避免并发对全局内存中的Prepare对象进行相关操作导致的冲突。
在一些实施例中,全局内存200可参考图2所示,检测全局内存中是否存在与预编译语句1对应的全局预编译对象1。
在另一些实施例中,参照图3所示,全局内存300中包括多个内存池,根据预设的链路和内存池的映射关系,获取第一目标内存池;其中,所述第一目标内存池为所述SQL预编译请求所属的链路映射的内存池;在全局内存中创建的全局预编译对象具体包括;在第一目标内存池中创建全局预编译对象;对所述全局内存加锁,包括:对所述第一目标内存池加锁;所述对释放对所述全局内存加的锁,包括:释放对所述第一目标内存池加的锁。内存池的个数可设计为固定值,也可设计为可配置。当内存池个数设置为1时,则Prepare对象为全局可复用;若设置为大于1的值,则Prepare对象为相应内存池内可复用。
在本实施例的复用全局预编译对象的方法中,将唯一的存放所有Prepare对象的全局内存结构改进为内存池,并且一个数据库系统可存在多个内存池。内存池的实现方式可根据具体数据库特点选择,如使用hash_map实现。
具体的某一个Prepare对象由哪个内存池管理,可根据实际情况设计合适的选择方法,例如可根据Prepared Statement的链路ID对内存池个数取模获得。在确定了管理Prepare对象的内存池后,内存池负责Prepare对象的申请、释放,也负责确定该Prepare对象是否空闲,是否可交由正在请求该Prepare对象的具体链路访问。只要链路被分配到访问某一个内存池,同一链路内和不同链路间均可复用内存池中的Prepare对象。
相较于将整个全局内存中加锁、释放锁,在高并发场景下可能会导致锁冲突较多,降低数据库性能,在本实施例中,将全局内存划分为多个内存池,缓解了Prepare对象的全局唯一内存管理结构的锁冲突,将锁冲突分散给了多个内存池,每次访问某个Prepare对象只需要对该内存池加锁即可,影响范围从全局缩小到了某一个内存池,进而减少了数据库性能损失。例如,若内存池个数为M,则锁冲突平均减少到了原来的1/M。
在另一些实施例中,可参照图4所示,在全局内存400中可创建预编译对象单元401,预编译对象单元中的每个全局预编译对象都对应同一预编译语句。服务器可判断与所述预编译语句对应的预编译对象的个数,即当前预编译对象单元中的预编译对象个数是否达到预设值;若未达到所述预设值,则根据所述预编译语句创建全局预编译对象并使用所述创建的全局预编译对象进行预编译;若达到所述预设值,则不做预编译对象的创建和执行预编译操作,向客户端返回预编译成功指令。若获取到一个空闲的预编译对象,即执行步骤103。示例性的,根据Prepare语句的字符串,或其MD5等特征值,寻找对应的Prepare对象单元。
在本实施例中,在全局内存内部,允许同一个Prepare语句对应多个Prepare对象,且相同的Prepare对象个数不能超过“Prepare对象最大并发数”,即不超过预设值。Prepare对象最大并发数的含义是,在同一内存池中,同时允许访问某一Prepare对象的最大链路个数,也是内存池中Prepare对象的最大副本个数,或者Prepare对象可重复数。
也就是说,本实施例中新增一种内存结构,用来管理全局内存内部的相同Prepare对象,即“Prepare对象单元”。当创建Prepare对象时,在相同的Prepare对象个数未超过“最大并发数”,即预设值时,内存池会真实的为该Prepare对象分配内存,并放入对应的Prepare对象单元中;而在超过“最大并发数”时,内存池不会真实为Prepare对象分配内存,而是复用,可对引用该预编译对象单元中的预编译对象的个数进行计数,得到引用计数。当需要访问Prepare对象时,先找到Prepare对象单元,然后寻找单元内的空闲Prepare对象,再对该Prepare对象做相应操作。当需要释放Prepare对象时,先找到Prepare对象单元,如果引用计数超过最大并发数,则不做真实的Prepare对象内存释放,直接减引用计数即可;如果引用计数未超过最大并发数,则寻找单元内的空闲Prepare对象,然后释放该Prepare对象内存,减引用计数。
即,在找到预编译对象单元后,查看Prepare对象单元中的引用计数,若小于Prepare对象最大并发数,则在内存池中新建Prepare对象,放入到Prepare对象单元中,并引用计数加1,将该Prepare对象设置为idle空闲状态;若大于Prepare对象最大并发数,则仅引用计数加1。
Prepare对象最大并发数,即预设值可设计为固定值,也可设计为可配置。当最大并发数设置为1时,则与不引入最大并发数效果一样;若设置为大于1的值(如设置为N),则Prepare对象在内存池内可同时被N个链路访问。
Prepare对象最大并发数的引入,能够缓解了Prepare对象自身的访问锁冲突。这种方法避免了某个Prepare对象正在被访问,则其他待访问的链路只能锁等待;引入最大并发数,例如最大并发数为N后,则可同时允许N个链路同时访问某个Prepare对象,减少了数据库性能损失,锁冲突平均减少到了原来的1/N。
在另一些实施例中,预编译对象单元中的各全局预编译对象,即某预编译语句对应的各全局预编译对象的预编译对象公用字段。预编译对象公用字段为不会更改或发生并发冲突的字段。
在“Prepare对象单元”内部,可以存在多个相同的Prepare对象,这些Prepare对象中又存在一些字段是一定不会更改或者不会存在并发冲突的,例如每个Prepare对象中都会存储的SQL语句字符串、Prepare对象对应的库名等。将这类字段,即Prepare对象公用字段全部提取出来存储在“Prepare对象单元”结构中,且仅存一份。所有内部的Prepare对象的这类字段全部指向该结构即可。这样进一步减少了Prepare对象的内存占用,更加精细化的做到了Prepare对象复用。更重要的是,原本每个Prepare对象均会为用户传入的这类字段申请和拷贝内存,在字段复用之后这类操作已经不再存在。在高并发场景下这类操作原本非常频繁,省掉这类操作后,性能较原session级Prepare对象的数据库性能更优。
示例性的,可将创建的预编译对象中的预编译对象公用字段指向预编译单元上对应的预编译字段。
在另一些实施例中,可参照图5所示,在全局内存500中,可将内存池结构和预编译对象单元的内存结构结合,一个内存池可有多个预编译对象单元。即,本实施例在存在与所述预编译语句对应的全局预编译对象的情况下,在检测所述对应的全局预编译对象是否处于空闲状态之前,判断在所述第一目标内存池中,与所述预编译语句对应的全局预编译对象的个数是否达到预设值;在未达到所述预设值的情况下,根据所述预编译语句,创建全局预编译对象并使用所述创建的全局预编译对象进行预编译;在达到所述预设值的情况下,则不做预编译对象的创建和执行预编译操作,可以直接向客户端返回预编译成功指令,即进入步骤103。
在本实施例中,若内存池个数为M,Prepare对象最大并发数为N,则整体的锁冲突相较于初始的Prepare对象全局复用方案减少到了原来的1/(M*N)。而针对具体的业务和服务器调整M和N的值,可以使得在数据库性能影响不大的前提下,大幅降低SQL预编译模式下的内存占用。
步骤103,在存在与预编译语句对应的全局预编译对象的情况下,向客户端返回预编译成功指令。
在一些实施例中,在存在与预编译语句对应的全局预编译对象,且该对应的全局预编译对象的个数达到预设的最大并发数,即预设值的情况下,向客户端返回预编译成功指令。即当对应的全局预编译对象的个数达到预设的最大并发数,无需新建对应的全局预编译对象进行预编译。
在一些实施例中,在完成预编译对象的预编译时,将该预编译对象置为空闲状态,并将引用计数自增1,表示引用该预编译对象单元的链路的个数,在使用对应的预编译对象进行执行等操作前,将全局预编译对象加锁,即由空闲状态置为忙碌状态,以免其他链路使用该对应的全局预编译对象,产生并发冲突。
步骤104,在不存在与预编译语句对应的全局预编译对象的情况下,根据预编译语句,创建全局预编译对象,并使用创建的全局预编译对象进行预编译。预编译完成之后,可向客户端发送预编译成功指令。
在一些实施例中,可先创建与预编译语句对应的预编译对象单元,然后在预编译对象单元中创建全局预编译对象。
预编译对象成功后,可向客户端返回Prepare成功的消息。
值得一提的是,常见的数据库的SQL预编译模式一般包括:预编译(prepare)流程、执行(execute)流程、游标取值(fetch)流程、关闭(close流程,或deallocate流程)、断链流程。
上述简述了Prepare流程,以下简述预编译之后,接收预编译对象操作指令,例如执行指令,游标取值指令,关闭指令,释放指令,并进入相应流程的过程。
在一些实施例中,在使用所述全局预编译对象进行预编译之后,若接收到预编译对象操作指令,则根据所述预编译对象操作指令,在所述全局内存中查找目标全局预编译对象;使用查找到的所述目标全局预编译对象执行操作指令。目标全局预编译对象需处于空闲状态,才能执行操作指令。
在一些实施例中,根据所述预编译对象操作指令,在所述全局内存中查找目标全局预编译对象之前,对所述全局内存池加锁;在查找到所述目标全局预编译对象后,释放对所述全局内存池加的锁。
在一些实施例中,所述全局内存中包括多个内存池,所述在所述全局内存中查找目标全局预编译对象,包括:根据预设的链路和内存池的映射关系,获取第二目标内存池;其中,所述第二目标内存池为所述预编译对象操作指令所属的链路映射的内存池;在所述第二目标内存池中查找所述目标全局预编译对象;所述对所述全局内存池加锁,包括:对所述第二目标内存池加锁;所述释放对所述全局内存池加的锁,包括:释放对所述第二目标内存池加的锁。
以下简要阐述接收预编译对象操作指令,进行相应操作的流程,可参见图6所示。
步骤601,接收预编译对象操作指令。
示例性的,操作指令可包括执行(execute)请求,取值(fetch)请求,释放对象(close或deallocate)请求,断链请求。
步骤602,根据预设的链路和内存池的映射关系,获取第二目标内存池。
示例性的,可以根据预编译对象操作指令所在链路的ID,计算出内存池号,并找到对应的内存池。
步骤603,对第二目标内存池加锁。
步骤604,根据预编译语句和Prepare对象的映射关系,在内存池中找到目标预编译对象单元。
示例性的,在第二目标内存池内,根据Prepare语句的字符串,或Prepare语句的MD5值等能够标识预编译语句的特征值寻找对应的Prepare对象单元。
步骤605,释放对第二目标内存池加的锁。
步骤606,在目标预编译对象单元中查找目标全局预编译对象。
在一些实施例中,在预编译对象操作指令为execute请求的情况下,若该Prepare对象单元中存在空闲(idle)状态的Prepare对象,则获取该Prepare对象,将该Prepare对象作为目标全局预编译对象,并将其置为busy状态;若该Prepare对象单元中的Prepare对象均为busy状态,则等待其中一个转变为idle状态后,获取该idle状态的Prepare对象,将该Prepare对象作为目标全局预编译对象,并将其置为busy状态。
在一些实施例中,在预编译对象操作指令为fetch请求的情况下,将链路在execute操作中绑定的Prepare对象作为目标全局预编译对象。值得一提的是,一般是在execute操作指令完成之后,服务端才会接收到fetch请求。
在一些实施例中,在预编译对象操作指令为close或者deallocate请求的情况下,查看Prepare对象单元中的引用计数,若小于等于Prepare对象最大并发数,即预设值,则获取一个链路绑定的或者idle状态的Prepare对象,将其作为目标全局预编译对象。
在一些实施例中,在预编译对象操作指令为断链信号的情况下,将链路下所有绑定的预编译对象作为目标全局预编译对象。
步骤607,使用查找到的所述目标全局预编译对象执行操作指令。
在一些实施例中,在预编译对象操作指令为execute请求的情况下,则执行execute操作,即使用该预编译对象执行SQL语句,并判断execute请求中是否携带游标取值(fetch)属性,若execute请求没有fetch属性,则将该Prepare对象设置为idle状态,一次性返回execute操作的结果集;若本次execute包含fetch属性,则将该Prepare对象绑定到操作指令所在的链路上,向客户端返回execute成功的指令。
在一些实施例中,预编译对象操作指令为fetch请求的情况下,对预编译对象执行fetch操作,若当前为最后一次做fetch,即最后一次返回execute结果,则将该Prepare对象从链路绑定中移除,并且将Prepare对象置为idle状态;返回fetch成功,返回本次fetch结果集。
在一些实施例中,在预编译对象操作指令为close或者deallocate请求的情况下,若Prepare对象单元中的引用计数小于或等于Prepare对象最大并发数,则执行原有的close操作,释放目标全局预编译对象内存空间,并将预编译对象引用计数减1;若Prepare对象单元中的引用计数大于Prepare对象最大并发数,则仅将引用计数减1,并返回close或deallocate成功。
在一些实施例中,在预编译对象操作指令为断链信号的情况下,,将链路下所有已绑定的Prepare对象,即目标全局预编译对象移除绑定关系,并将链路下所有已引用的Prepare对象内存空间释放,然后执行断链操作。
值得一提的是,在一些数据库中,SQL预编译模式可能还包括分批次接收二进制长字段(如blob相关类型)的send_long_data流程,可能还包括reset流程等。这些流程的处理均改造为先查找内存池,再查找Prepare对象单元,拿到idle的Prepare对象做处理。另外,在send_long_data流程中,还涉及到链路绑定正在处理的Prepare对象。具体流程不再逐一列举。
另外,在遇到Prepare对象单元中所有Prepare对象均被绑定的情况,则再克隆一个Prepare对象置为idle以供使用;在将绑定关系移除时,若Prepare对象个数超过最大并发数,则删除一个idle的Prepare对象。
本实施例的SQL预编译方法方法,实现了数据库系统中Prepare对象在链路内和链路间的复用,显著减少了重复的Prepare对象引发的内存空间占用。再配合引入多内存池和Prepare对象最大并发数,可将数据库性能损失的副作用降到最低,另外,提出复用相同Prepare对象中的相同字段的方法,使得数据库性能不降反升,在显著降低内存空间占用的情况下,同时做到性能提升。
本申请的另一个实施例涉及一种SQL预编译装置,下面对本实施例的SQL预编译装置的细节进行具体的说明,以下内容仅为方便理解提供的实现细节,并非实施本例的必须,图7是本实施例所述的SQL预编译装置的示意图,包括:获取模块701,用于获取SQL预编译请求,其中,所述预编译请求中携带有预编译语句;检测模块702,用于检测全局内存中是否存在与所述预编译语句对应的全局预编译对象;预编译模块703,用于在存在与所述预编译语句对应的全局预编译对象的情况下,向客户端返回预编译成功指令;在不存在与所述预编译语句对应的全局预编译对象的情况下,根据所述预编译语句,创建全局预编译对象,并使用所述创建的全局预编译对象进行预编译。
在一些实施例中,SQL预编译装置还包括:加解锁模块,加解锁模块用于在所述获取SQL预编译请求之后,对所述全局内存或某一内存池加锁;在查找到所述处于空闲状态且与所述预编译语句对应的全局预编译对象之后,或者,在所述创建全局预编译对象之后,释放对所述全局内存或某一内存池加的锁。
在一些实施例中,SQL预编译装置还包括目标内存池获取模块,目标内存池获取模块用于在所述获取SQL预编译请求之后,根据预设的链路和内存池的映射关系,获取第一目标内存池;其中,所述第一目标内存池为所述SQL预编译请求所属的链路映射的内存池;检测模块702进一步用于检测所述第一目标内存池中是否存在与所述预编译语句对应的全局预编译对象;预编译模块703进一步用于在所述第一目标内存池中创建全局预编译对象;加解锁模块进一步用于对所述第一目标内存池加锁,释放对所述第一目标内存池加的锁。
在一些实施例中,检测模块702进一步用于在存在与所述预编译语句对应的全局预编译对象的情况下,判断在所述第一目标内存池中,与所述预编译语句对应的全局预编译对象的个数是否达到预设值;在未达到所述预设值的情况下,根据所述预编译语句,创建全局预编译对象并使用所述创建的全局预编译对象进行预编译;在达到所述预设值的情况下,进入向客户端返回预编译成功指令的步骤。
在一些实施例中,预编译模块703中预编译语句对应的各全局预编译对象共用预编译对象公用字段。
在一些实施例中,预编译模块703进一步用于在使用所述全局预编译对象进行预编译之后,若接收到预编译对象操作指令,则根据所述预编译对象操作指令,在所述全局内存中查找目标全局预编译对象;使用查找到的所述目标全局预编译对象执行操作指令。
在一些实施例中,加解锁模块进一步用于根据所述预编译对象操作指令,在所述全局内存中查找目标全局预编译对象之前,对所述全局内存池加锁;在查找到所述目标全局预编译对象后,释放对所述全局内存池加的锁。
在一些实施例中,检测模块702进一步用于根据预设的链路和内存池的映射关系,获取第二目标内存池;其中,所述第二目标内存池为所述预编译对象操作指令所属的链路映射的内存池;加解锁模块进一步用于对所述第二目标内存池加锁;释放对所述第二目标内存池加的锁。
不难发现,本实施例为与上述方法实施例对应的系统实施例,本实施例可以与上述方法实施例互相配合实施。上述实施例中提到的相关技术细节和技术效果在本实施例中依然有效,为了减少重复,这里不再赘述。相应地,本实施例中提到的相关技术细节也可应用在上述实施例中。
值得一提的是,本实施例中所涉及到的各模块均为逻辑模块,在实际应用中,一个逻辑单元可以是一个物理单元,也可以是一个物理单元的一部分,还可以以多个物理单元的组合实现。此外,为了突出本申请的创新部分,本实施例中并没有将与解决本申请所提出的技术问题关系不太密切的单元引入,但这并不表明本实施例中不存在其它的单元。
本申请另一个实施例涉及一种电子设备,如图8所示,包括:至少一个处理器801;以及,与所述至少一个处理器801通信连接的存储器802;其中,所述存储器802存储有可被所述至少一个处理器801执行的指令,所述指令被所述至少一个处理器801执行,以使所述至少一个处理器801能够执行上述各实施例中的SQL预编译方法。
其中,存储器和处理器采用总线方式连接,总线可以包括任意数量的互联的总线和桥,总线将一个或多个处理器和存储器的各种电路连接在一起。总线还可以将诸如外围设备、稳压器和功率管理电路等之类的各种其他电路连接在一起,这些都是本领域所公知的,因此,本文不再对其进行进一步描述。总线接口在总线和收发机之间提供接口。收发机可以是一个元件,也可以是多个元件,比如多个接收器和发送器,提供用于在传输介质上与各种其他装置通信的单元。经处理器处理的数据通过天线在无线介质上进行传输,进一步,天线还接收数据并将数据传送给处理器。
处理器负责管理总线和通常的处理,还可以提供各种功能,包括定时,外围接口,电压调节、电源管理以及其他控制功能。而存储器可以被用于存储处理器在执行操作时所使用的数据。
本申请另一个实施例涉及一种计算机可读存储介质,存储有计算机程序。计算机程序被处理器执行时实现上述方法实施例。
即,本领域技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本领域的普通技术人员可以理解,上述各实施方式是实现本申请的具体实施例,而在实际应用中,可以在形式上和细节上对其作各种改变,而不偏离本申请的精神和范围。
Claims (11)
1.一种SQL预编译方法,其特征在于,包括:
获取SQL预编译请求,其中,所述SQL预编译请求中携带有预编译语句;
检测全局内存中是否存在与所述预编译语句对应的全局预编译对象;
在存在与所述预编译语句对应的全局预编译对象的情况下,向客户端返回预编译成功指令;
在不存在与所述预编译语句对应的全局预编译对象的情况下,根据所述预编译语句,创建全局预编译对象,并使用所述创建的全局预编译对象进行预编译。
2.根据权利要求1所述的SQL预编译方法,其特征在于,在所述获取SQL预编译请求之后,还包括:
对所述全局内存加锁;
在所述创建全局预编译对象之后,还包括:
释放对所述全局内存加的锁。
3.根据权利要求2所述的SQL预编译方法,其特征在于,所述全局内存中包括多个内存池,在所述获取SQL预编译请求之后,还包括:
根据预设的链路和内存池的映射关系,获取第一目标内存池;其中,所述第一目标内存池为所述SQL预编译请求所属的链路映射的内存池;
所述检测全局内存中是否存在与所述预编译语句对应的全局预编译对象,包括:
检测所述第一目标内存池中是否存在与所述预编译语句对应的全局预编译对象;
所述创建全局预编译对象,包括:
在所述第一目标内存池中创建全局预编译对象;
所述对所述全局内存加锁,包括:
对所述第一目标内存池加锁;
所述对释放对所述全局内存加的锁,包括:
释放对所述第一目标内存池加的锁。
4.根据权利要求3所述的SQL预编译方法,其特征在于,在存在与所述预编译语句对应的全局预编译对象的情况下,在所述向客户端返回预编译成功指令之前,还包括:
判断在所述第一目标内存池中,与所述预编译语句对应的全局预编译对象的个数是否达到预设值;
在未达到所述预设值的情况下,根据所述预编译语句,创建全局预编译对象并使用所述创建的全局预编译对象进行预编译;
在达到所述预设值的情况下,进入所述向客户端返回预编译成功指令的步骤。
5.根据权利要求4所述的SQL预编译方法,其特征在于,所述预编译语句对应的各全局预编译对象共用预编译对象公用字段。
6.根据权利要求1所述的SQL预编译方法,其特征在于,在使用所述全局预编译对象进行预编译之后,还包括:
若接收到预编译对象操作指令,则根据所述预编译对象操作指令,在所述全局内存中查找目标全局预编译对象;
使用查找到的所述目标全局预编译对象执行操作指令。
7.根据权利要求6所述的SQL预编译方法,其特征在于,所述根据所述预编译对象操作指令,在所述全局内存中查找目标全局预编译对象之前,包括:
对所述全局内存池加锁;
在查找到所述目标全局预编译对象后,还包括:
释放对所述全局内存池加的锁。
8.根据权利要求7所述的SQL预编译方法,其特征在于,所述全局内存中包括多个内存池,所述在所述全局内存中查找目标全局预编译对象,包括:
根据预设的链路和内存池的映射关系,获取第二目标内存池;其中,所述第二目标内存池为所述预编译对象操作指令所属的链路映射的内存池;
在所述第二目标内存池中查找所述目标全局预编译对象;
所述对所述全局内存池加锁,包括:
对所述第二目标内存池加锁;
所述释放对所述全局内存池加的锁,包括:
释放对所述第二目标内存池加的锁。
9.一种SQL预编译装置,其特征在于,包括:
获取模块,用于获取SQL预编译请求,其中,所述预编译请求中携带有预编译语句;
检测模块,用于检测全局内存中是否存在与所述预编译语句对应的全局预编译对象;
预编译模块,用于在存在与所述预编译语句对应的全局预编译对象,向客户端返回预编译成功指令;在不存在与所述预编译语句对应的全局预编译对象的情况下,根据所述预编译语句,创建全局预编译对象,并使用所述创建的全局预编译对象进行预编译。
10.一种服务器,其特征在于,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如权利要求1至8中任一项所述的SQL预编译方法。
11.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至8中任一项所述SQL预编译方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111461115.7A CN116204546A (zh) | 2021-11-30 | 2021-11-30 | Sql预编译方法、装置、服务器和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111461115.7A CN116204546A (zh) | 2021-11-30 | 2021-11-30 | Sql预编译方法、装置、服务器和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116204546A true CN116204546A (zh) | 2023-06-02 |
Family
ID=86517958
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111461115.7A Pending CN116204546A (zh) | 2021-11-30 | 2021-11-30 | Sql预编译方法、装置、服务器和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116204546A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116610705A (zh) * | 2023-07-20 | 2023-08-18 | 金篆信科有限责任公司 | 分布式数据库预编译管理方法、装置、设备及存储介质 |
-
2021
- 2021-11-30 CN CN202111461115.7A patent/CN116204546A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116610705A (zh) * | 2023-07-20 | 2023-08-18 | 金篆信科有限责任公司 | 分布式数据库预编译管理方法、装置、设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10176222B2 (en) | Query plan optimization for prepared SQL statements | |
CN108536705B (zh) | 数据库系统中对象的编码及运算方法与数据库服务器 | |
US9043309B2 (en) | SQL transformation-based optimization techniques for enforcement of data access control | |
US9576012B2 (en) | Hierarchical tablespace space management | |
CN107038222B (zh) | 数据库缓存实现方法及其系统 | |
CN110325985B (zh) | 使用对高速缓存友好的存储器内散列索引的原子rdma读取的基于主键的高效查询的方法 | |
CN111581234B (zh) | Rac多节点数据库查询方法、装置及系统 | |
US10262025B2 (en) | Managing a temporal key property in a database management system | |
US9460144B2 (en) | Lock acceleration | |
US10943023B2 (en) | Method for filtering documents and electronic device | |
CN108376156B (zh) | 创建数据库索引的方法、装置、服务器及存储介质 | |
CN104111958A (zh) | 一种数据查询方法及装置 | |
US11269829B2 (en) | Row level locking for columnar data | |
CN113553339B (zh) | 数据查询方法、中间件、电子装置和存储介质 | |
CN109299101B (zh) | 数据检索方法、装置、服务器和存储介质 | |
CN111857539B (zh) | 用于管理存储系统的方法、设备和计算机可读介质 | |
CN109117426B (zh) | 分布式数据库查询方法、装置、设备及存储介质 | |
WO2022127866A1 (zh) | 数据处理方法、装置、电子设备、存储介质 | |
CN116204546A (zh) | Sql预编译方法、装置、服务器和存储介质 | |
US10558636B2 (en) | Index page with latch-free access | |
CN114860764A (zh) | 分布式数据库查询的优化方法、系统及电子设备 | |
JP6586174B2 (ja) | データベースシステム、トランザクション管理ノード、方法およびプログラム | |
US9063858B2 (en) | Multi-core system and method for data consistency by memory mapping address (ADB) to hash table pattern associated with at least one core | |
JP2001282599A (ja) | データ管理方法および装置並びにデータ管理プログラムを格納した記録媒体 | |
CN109739874B (zh) | 提供数据内容的方法、装置、计算机设备及存储介质 |
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 |