发明内容
本发明实施例提供一种数据库查询方法及设备,以实现缓存查询结果的内存的共享,提高数据查询的有效性。
第一方面,本发明实施例提供一种数据库查询方法,包括:
第一业务进程向数据库服务器发送携带有结构查询语言SQL查询命令的第一查询请求消息;
所述第一业务进程接收所述数据库服务器返回的、用以指示所述SQL查询命令对应的查询结果缓存有效的指示消息,向缓存管理进程发送所述SQL查询命令;
所述缓存管理进程根据所述SQL查询命令从存储器获取第一查询结果,将所述第一查询结果返回给所述第一业务进程。
在第一种可能的实现方式中,所述第一业务进程向数据库服务器发送携带有结构查询语言SQL查询命令的第一查询请求消息之前,所述方法还包括:
第二业务进程向所述数据库服务器发送所述携带有所述SQL查询命令的第二查询请求消息;
所述第二业务进程接收所述数据库服务器返回的、根据所述SQL查询命令查询到的所述第一查询结果,将所述有SQL查询命令和所述第一查询结果发送给所述缓存管理进程;
所述缓存管理进程将所述第一查询结果存储到所述存储器,建立所述SQL查询命令与所述第一查询结果的对应关系。
结合第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述缓存管理进程建立所述SQL查询命令与所述第一查询结果的对应关系,包括:
所述缓存管理进程对所述SQL查询命令进行哈希处理生成哈希值,将所述哈希值与链表对应存储在所述存储器中,其中,所述链表中记录有所述SQL查询命令与所述第一查询结果的存储地址的对应关系;
所述缓存管理进程根据所述SQL查询命令从存储器获取第一查询结果,包括:
所述缓存管理对所述SQL查询命令进行哈希处理生成所述哈希值,根据所述哈希值从所述存储器中确定链表,根据所述SQL查询命令从所述链表中确定所述第一查询结果的存储地址,根据所述存储地址从所述存储器中获取所述第一查询结果。
结合第一方面的第一种可能的实现方式,在第三种可能的实现方式中,所述缓存管理进程将所述第一查询结果存储到所述存储器,建立所述SQL查询命令与所述第一查询结果的对应关系之后,所述方法还包括:
所述缓存管理进程若判断获知所述存储器中还存储有所述SQL查询命令对应的第二查询结果,且没有业务进程读取所述第二查询结果,则将所述第二查询结果删除,并释放存储器中用于存储所述第二查询结果的存储空间。
第二方面,本发明实施例提供一种数据库查询方法,包括:
接收数据库客户端装置的第一业务进程发送的携带有结构查询语言SQL查询命令的第一查询请求消息;
判断所述SQL查询命令对应的查询结果缓存是否有效,若是,则向所述数据库客户端装置的第一业务进程发送用于指示所述SQL查询命令对应的查询结果缓存有效的指示消息,以使得所述数据库客户端装置的第一业务进程向所述数据库客户端装置的缓存管理进程发送所述SQL查询命令,所述缓存管理进程根据所述SQL查询命令从存储器获取第一查询结果,将所述第一查询结果返回给所述第一业务进程。
在第一种可能的实现方式中,所述接收数据库客户端装置的第一业务进程发送的携带有结构查询语言SQL查询命令的查询请求消息之前,所述方法还包括:
接收所述数据库客户端装置的第二业务进程发送的携带有所述SQL查询命令的第二查询请求消息;
判断所述SQL查询命令对应的查询结果缓存是否有效,若否,则根据所述SQL查询命令查询到所述第一查询结果,将所述第一查询结果返回给所述数据库客户端装置的第二业务进程,以使所述第二业务进程将所述第一查询结果发送给所述缓存管理进程,所述缓存管理进程将所述第一查询结果存储到所述存储器,建立所述SQL查询命令与所述第一查询结果的对应关系。
结合第二方面或第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述判断所述SQL查询命令对应的查询结果缓存是否有效,包括:
若所述SQL查询命令所查询的数据库的数据库改变序列号的值没有发生变化,则所述SQL查询命令对应的查询结果缓存有效;或者,
若所述SQL查询命令所查询的数据库的数据库改变序列号的值发生变化,所述SQL查询命令所查询的表的表改变序列号的值没有发生变化,则所述SQL查询命令对应的查询结果缓存有效;或者,
若所述SQL查询命令所查询的数据库的数据库改变序列号和所述SQL查询命令所查询的表的表改变序列号的值发生变化,所述SQL查询命令所查询的列的列改变序列号的值没有变化,则所述SQL查询命令对应的查询结果缓存有效;或者,
若所述SQL查询命令所查询的列的列改变序列号的值发生变化,则所述SQL查询命令对应的查询结果缓存无效。
结合第二方面的第二种可能的实现方式,在第三种可能的实现方式中,所述方法还包括:
接收数据修改指令,将所述数据修改指令对应的数据库的表的列的内容进行修改,将修改的数据库的数据库改变序列号、修改的表的表改变序列号和修改的列的列改变序列号的值分别加1。
第三方面,本发明实施例提供一种数据库客户端装置,包括:第一业务进程单元和缓存管理进程单元;
所述第一业务进程单元,用于向数据库服务器发送携带有结构查询语言SQL查询命令的第一查询请求消息,接收所述数据库服务器返回的、用以指示所述SQL查询命令对应的查询结果缓存有效的指示消息,向缓存管理进程单元发送所述SQL查询命令;
所述缓存管理进程单元,用于根据所述SQL查询命令从存储器获取第一查询结果,将所述第一查询结果返回给所述第一业务进程单元。
在第一种可能的实现方式中,所述数据库客户端装置,还包括:
第二业务进程单元,用于向所述数据库服务器发送所述携带有所述SQL查询命令的第二查询请求消息,接收所述数据库服务器返回的、根据所述SQL查询命令查询到的所述第一查询结果,将所述有SQL查询命令和所述第一查询结果发送给所述缓存管理进程单元;
所述缓存管理进程单元,还用于将所述第一查询结果存储到所述存储器,建立所述SQL查询命令与所述第一查询结果的对应关系。
结合第三方面的第一种可能的实现方式,在第二种可能的实现方式中,所述缓存管理进程单元,还用于对所述SQL查询命令进行哈希处理生成哈希值,将所述哈希值与链表对应存储在所述存储器中,其中,所述链表中记录有所述SQL查询命令与所述第一查询结果的存储地址的对应关系;对所述SQL查询命令进行哈希处理生成所述哈希值,根据所述哈希值从所述存储器中确定链表,根据所述SQL查询命令从所述链表中确定所述第一查询结果的存储地址,根据所述存储地址从所述存储器中获取所述第一查询结果。
结合第三方面的第一种可能的实现方式,在第三种可能的实现方式中,所述缓存管理进程单元,还用于若判断获知所述存储器中还存储有所述SQL查询命令对应的第二查询结果,且没有业务进程读取所述第二查询结果,则将所述第二查询结果删除,并释放存储器中用于存储所述第二查询结果的存储空间。
第四方面,本发明实施例提供一种数据库服务器,包括:
接收单元,用于接收数据库客户端装置的第一业务进程发送的携带有结构查询语言SQL查询命令的第一查询请求消息;
处理单元,用于判断所述SQL查询命令对应的查询结果缓存是否有效,若是,则向所述数据库客户端装置的业务进程发送用于指示所述SQL查询命令对应的查询结果缓存有效的指示消息,以使得所述数据库客户端装置的第一业务进程向所述数据库客户端装置的缓存管理进程发送所述SQL查询命令,所述缓存管理进程根据所述SQL查询命令从存储器获取第一查询结果,将所述第一查询结果返回给所述第一业务进程。
在第一种可能的实现方式中,所述接收单元,还用于接收所述数据库客户端装置的第二业务进程发送的携带有所述SQL查询命令的第二查询请求消息;
所述处理单元,还用于判断所述SQL查询命令对应的查询结果缓存是否有效,若否,则根据所述SQL查询命令查询到所述第一查询结果,将所述第一查询结果返回给所述数据库客户端装置的第二业务进程,以使所述第二业务进程将所述第一查询结果发送给所述缓存管理进程,所述缓存管理进程将所述第一查询结果存储到所述存储器,建立所述SQL查询命令与所述第一查询结果的对应关系。
结合第四方面或第四方面的第一种可能的实现方式,在第二种可能的实现方式中,所述处理单元,还用于若所述SQL查询命令所查询的数据库的数据库改变序列号的值没有发生变化,则所述SQL查询命令对应的查询结果缓存有效;或者,
若所述SQL查询命令所查询的数据库的数据库改变序列号的值发生变化,所述SQL查询命令所查询的表的表改变序列号的值没有发生变化,则所述SQL查询命令对应的查询结果缓存有效;或者,
若所述SQL查询命令所查询的数据库的数据库改变序列号和所述SQL查询命令所查询的表的表改变序列号的值发生变化,所述SQL查询命令所查询的列的列改变序列号的值没有变化,则所述SQL查询命令对应的查询结果缓存有效;或者,
若所述SQL查询命令所查询的列的列改变序列号的值发生变化,则所述SQL查询命令对应的查询结果缓存无效。
结合第四方面的第四种可能的实现方式,在第三种可能的实现方式中,所述接收单元,还用于接收数据修改指令;
所述处理单元,还用于将所述数据修改指令对应的数据库的表的列的内容进行修改,将修改的数据库的数据库改变序列号、修改的表的表改变序列号和修改的列的列改变序列号的值分别加1。
第五方面,本发明实施例提供一种用于数据库客户端的计算机节点,包括:处理器,通信接口,存储器和总线:
其中所述处理器、所述通信接口和所述存储器通过所述总线完成相互间的通信;
所述通信接口,用于向数据库服务器发送携带有结构查询语言SQL查询命令的第一查询请求消息,接收所述数据库服务器返回的、用以指示所述SQL查询命令对应的查询结果缓存有效的指示消息;
所述存储器,用于存储指令和第一查询结果;
所述处理器被配置为执行存储在所述存储器中的指令,其中,所述处理器被配置为用于调用第一业务进程通过所述通信接口向数据库服务器发送携带有结构查询语言SQL查询命令的第一查询请求消息,接收所述数据库服务器返回的、用以指示所述SQL查询命令对应的查询结果缓存有效的指示消息,向缓存管理进程发送所述SQL查询命令;调用所述缓存管理进程根据所述SQL查询命令从所述存储器获取所述第一查询结果,将所述第一查询结果返回给所述第一业务进程。
第六方面,本发明实施例提供一种数据库服务器,包括:处理器,通信接口,存储器和总线:
其中所述处理器、所述通信接口和所述存储器通过所述总线完成相互间的通信;
所述通信接口,用于接收数据库客户端装置的第一业务进程发送的携带有结构查询语言SQL查询命令的第一查询请求消息;向所述数据库客户端装置的业务进程发送用于指示所述SQL查询命令对应的查询结果缓存有效的指示消息;
所述存储器,用于存储指令;
所述处理器被配置为执行存储在所述存储器中的指令,其中,所述处理器被配置为用于判断所述SQL查询命令对应的查询结果缓存是否有效,若是,则通过所述通信接口向所述数据库客户端装置的业务进程发送用于指示所述SQL查询命令对应的查询结果缓存有效的指示消息,以使得所述数据库客户端装置的第一业务进程向所述数据库客户端装置的缓存管理进程发送所述SQL查询命令,所述缓存管理进程根据所述SQL查询命令从存储器获取第一查询结果,将所述第一查询结果返回给所述第一业务进程。
由上述技术方案可知,本发明实施例提供的数据库查询方法及设备,数据库客户端装置的第一业务进程向数据库服务器发送携带有结构查询语言SQL查询命令的第一查询请求消息,接收数据库服务器返回的、用以指示SQL查询命令对应的查询结果缓存有效的指示消息,向缓存管理进程发送SQL查询命令,缓存管理进程根据SQL查询命令从存储器获取第一查询结果,将第一查询结果返回给第一业务进程。通过缓存管理进程的设置,实现了缓存查询结果的内存的共享,多个的业务进程均可以通过缓存管理进程对缓存的查询结果进行访问,避免了为每个业务进程分配内存以及对每个内存进行独立操作造成的资源浪费。而且,数据库服务器在接收到查询请求消息时判断SQL查询命令对应的查询结果缓存是否有效,在有效时指示数据库客户端装置读取自己缓存查询结果,提高了数据查询的有效性。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明实施例提供的第一种数据库查询方法流程图。如图1所示,本实施例提供的数据库查询方法具体可以应用于对数据库的查询过程,该数据库具体为SQL数据库。通常,SQL数据库设置在数据库服务器中作为服务器,例如个人电脑、笔记本电脑、平板电脑或智能手机等终端设备中可以设置数据库客户端,该数据库客户端的可以通过应用程序或中间件等方式来实现。本实施例提供的数据库查询方法可以通过数据库客户端装置来执行,该数据库客户端装置可以设置在上述终端设备中,也可以单独设置。
本实施例提供的数据库查询方法具体包括:
步骤C10、第一业务进程向数据库服务器发送携带有结构查询语言SQL查询命令的第一查询请求消息;
步骤C20、所述第一业务进程接收所述数据库服务器返回的、用以指示所述SQL查询命令对应的查询结果缓存有效的指示消息,向缓存管理进程发送所述SQL查询命令;
步骤C30、所述缓存管理进程根据所述SQL查询命令从存储器获取第一查询结果,将所述第一查询结果返回给所述第一业务进程。
具体地,数据库客户端装置开启SQL result cache机制,用户在通过数据库客户端装置对数据库服务器进行访问时,数据库客户端装置通过创建业务进程来执行相应的数据库查询任务,业务进程的数量可以为多个,每个业务进程之间不进行通信。在数据库客户端装置首次执行数据库查询任务时,创建一个缓存管理进程,业务进程可以与该缓存管理进程建立连接以实现通信,所建立的连接例如可以为UNIX Socket(套接字)连接,建立UNIX Socket连接所需要的文件路径可以由环境变量指定,或者为TCP(TransmissionControl Protocol,传输控制协议)Socket连接,IP地址为127.0.0.1,端口可以由环境变量指定。
用户通过数据库客户端装置对数据库服务器中的数据库进行查询,向数据库客户端装置输入查询参数,第一业务进程根据用户的输入执行该数据库查询任务,向数据库服务器发送第一查询请求消息,该第一查询请求消息中携带有SQL查询命令,SQL查询命令中具体可以包括SQL语句和SQL参数。数据库服务器接收该第一查询请求消息,判断该SQL查询命令对应的查询结果缓存是否有效。若数据库服务器之前没有处理过该SQL查询命令,则该SQL查询命令对应的查询结果缓存无效,或者该SQL查询命令所查询的内容与上次访问相比有所改变时,该SQL查询命令对应的查询结果缓存无效。若该SQL查询命令所查询的内容与上次访问相比没有改变,则该SQL查询命令对应的查询结果缓存有效。在实际应用中,数据库服务器可以设置与SQL查询命令对应的标志位,以记录该SQL查询命令对应的查询结果缓存是否有效,例如,有效时,标志位为1,无效时,标志位为0。SQL查询命令与标识位的对应关系形成结构体对象,可以通过但不限于数组或链表等形式对该结构体对象进行记录。
若数据库服务器判断获知该SQL查询命令对应的查询结果缓存有效,说明数据库客户端装置中缓存有该SQL查询命令对应的查询结果,且该查询结果有效,则向数据库客户端装置的第一业务进程返回指示该SQL查询命令对应的查询结果缓存有效的指示消息,第一业务进程向缓存管理进程发送SQL查询命令。缓存管理进程从存储器中获取缓存的SQL查询命令对应的第一查询结果,将该第一查询结果返回给第一业务进程,以完成数据查询。存储器具体可以为内存,存储器中缓存的该第一查询结果具体为该第一业务进程或者其他业务进程之前通过向数据库服务器发送该SQL查询命令获取的查询结果。
本实施例提供的数据库查询方法,数据库客户端装置的第一业务进程向数据库服务器发送携带有结构查询语言SQL查询命令的第一查询请求消息,接收数据库服务器返回的、用以指示SQL查询命令对应的查询结果缓存有效的指示消息,向缓存管理进程发送SQL查询命令,缓存管理进程根据SQL查询命令从存储器获取第一查询结果,将第一查询结果返回给第一业务进程。通过缓存管理进程的设置,实现了缓存查询结果的内存的共享,多个的业务进程均可以通过缓存管理进程对缓存的查询结果进行访问,避免了为每个业务进程分配内存以及对每个内存进行独立操作造成的资源浪费。而且,数据库服务器在接收到查询请求消息时判断SQL查询命令对应的查询结果缓存是否有效,在有效时指示数据库客户端装置读取自己缓存查询结果,提高了数据查询的有效性。
图2为本发明实施例提供的第二种数据库查询方法流程图。如图2所示,在本实施例中,步骤C10,所述第一业务进程向数据库服务器发送携带有结构查询语言SQL查询命令的第一查询请求消息之前,所述方法还包括:
步骤C40、第二业务进程向所述数据库服务器发送所述携带有所述SQL查询命令的第二查询请求消息;
步骤C50,所述第二业务进程接收所述数据库服务器返回的、根据所述SQL查询命令查询到的所述第一查询结果,将所述有SQL查询命令和所述第一查询结果发送给所述缓存管理进程;
步骤C60,所述缓存管理进程将所述第一查询结果存储到所述存储器,建立所述SQL查询命令与所述第一查询结果的对应关系。
具体地,第二业务进程与第一业务进程可以为同一进程,也可以为不同进程。第二业务进程向数据库服务器发送第二查询请求消息,该第二查询请求消息中携带有该SQL查询命令。若数据库服务器之前没有处理过该SQL查询命令,则该SQL查询命令不具有对应的标志位,该SQL查询命令对应的查询结果缓存无效,数据库服务器处理该SQL查询命令,得到该第一查询结果,将第一查询结果返回给该第二业务进程。第二业务进程将该第一查询结果发送给缓存管理进程,缓存管理进程为该第一查询结果分配内存,将该第一查询结果缓存,并建立该SQL查询命令与第一查询结果的对应关系。
或者,数据库服务器之前处理过该SQL查询命令,并向数据库客户端装置返回了一个第二查询结果,数据库客户端装置中缓存该第二查询结果。在这之后,发生了改变该SQL查询命令所查询的内容的事务,导致该SQL查询命令的查询结果也发生改变。此时,可以将该SQL查询命令对应的标志位设置为0,以指示SQL查询命令对应的查询结果缓存无效。即使数据库客户端装置中缓存有第二查询结果,但是数据库服务器处理该SQL查询命令,得到第一查询结果,并将该第一查询结果返回给第二业务进程,第二业务进程将该第一查询结果发送给缓存管理进程,缓存管理进程为该第一查询结果分配内存,将该第一查询结果缓存,并建立该SQL查询命令与第一查询结果的对应关系。数据库服务器将该SQL查询命令对应的标志位设置为1,以指示SQL查询命令对应的查询结果缓存有效。
数据库客户端装置每次的数据库查询过程都向数据库服务器发送查询请求消息,数据库服务器通过判断SQL查询命令对应的查询结果缓存是否有效,在SQL查询命令对应的查询结果发生变化时,及时地向数据库客户端装置反馈最新的查询结果,数据库客户端装的存储器中缓存的也是最新的查询结果,提高了数据库查询的准确性。
在本实施例中,步骤C60,所述缓存管理进程建立所述SQL查询命令与所述第一查询结果的对应关系,具体可以包括:
所述缓存管理进程对所述SQL查询命令进行哈希处理生成哈希值,将所述哈希值与链表对应存储在所述存储器中,其中,所述链表中记录有所述SQL查询命令与所述第一查询结果的存储地址的对应关系;
相应地,步骤C30,所述缓存管理进程根据所述SQL查询命令从存储器获取第一查询结果,具体可以包括:
所述缓存管理对所述SQL查询命令进行哈希处理生成所述哈希值,根据所述哈希值从所述存储器中确定链表,根据所述SQL查询命令从所述链表中确定所述第一查询结果的存储地址,根据所述存储地址从所述存储器中获取所述第一查询结果。
具体地,缓存管理进程将该第一查询结果存储到存储器中,该第一查询结果具有一存储地址,可以将SQL查询命令和该存储地址对应存储在链表中。缓存管理进程可以对SQL查询命令中的SQL语句和SQL参数进行哈希处理得到哈希值,建立哈希值与该链表的对应关系并,存储在存储器中。在实际应用中,不同的SQL查询命令的哈希值可能相同,则在同一个哈希值对应的链表中可能记录了一组或多组SQL查询命令与存储地址的对应关系。则相应地,缓存管理进程在从存储器中获取该第一查询结果时,可以首选根据哈希值从存储器中获取链表,在根据SQL查询命令从该链表中获取相应的存储地址,并从存储器的该存储地址中读取该第一查询结果。缓存管理进程也可以将该第一查询结果的存储地址返回给第一业务进程,第一业务进程根据该存储地址从存储器获得该第一查询结果。
在本实施例中,步骤C60,所述缓存管理进程将所述第一查询结果存储到所述存储器,建立所述SQL查询命令与所述第一查询结果的对应关系之后,所述方法还包括:
步骤C70,所述缓存管理进程若判断获知所述存储器中还存储有所述SQL查询命令对应的第二查询结果,且没有业务进程读取所述第二查询结果,则将所述第二查询结果删除,并释放存储器中用于存储所述第二查询结果的存储空间。
具体地,若数据库客户端装置还有业务进程在访问存储器中缓存的第二查询结果,则缓存管理进程不对该第二查询结果进行处理。若没有业务进程对该第二查询结果进行访问了,则缓存管理进程将该第二查询结果从存储器中删除,释放存储器中用于存储所述第二查询结果的存储空间,并将该SQL查询命令与该第二查询结果的对应关系撤销。
图3为本发明实施例提供的第三种数据库查询方法流程图。如图3所示,本实施例提供的数据库查询方法具体可以与本发明任意实施例提供的应用于数据库客户端装置的方法配合实现,具体实现过程在此不再赘述。本实施例提供的数据库查询方法可以通过数据库服务器来执行,数据库服务器中设置有数据库,该数据库具体为SQL数据库。
本实施例提供的数据库查询方法具体包括:
步骤S10、接收数据库客户端装置的第一业务进程发送的携带有结构查询语言SQL查询命令的第一查询请求消息;
步骤S20、判断所述SQL查询命令对应的查询结果缓存是否有效,若是,则向所述数据库客户端装置的第一业务进程发送用于指示所述SQL查询命令对应的查询结果缓存有效的指示消息,以使得所述数据库客户端装置的第一业务进程向所述数据库客户端装置的缓存管理进程发送所述SQL查询命令,所述缓存管理进程根据所述SQL查询命令从存储器获取第一查询结果,将所述第一查询结果返回给所述第一业务进程。
本实施例提供的数据库查询方法,数据库服务器接收数据库客户端装置的第一业务进程发送的携带有结构查询语言SQL查询命令的第一查询请求消息,判断SQL查询命令对应的查询结果缓存是否有效,若是,则向数据库客户端装置的第一业务进程发送用于指示SQL查询命令对应的查询结果缓存有效的指示消息,以使得数据库客户端装置的第一业务进程向数据库客户端装置的缓存管理进程发送SQL查询命令,缓存管理进程根据SQL查询命令从存储器获取第一查询结果,将第一查询结果返回给第一业务进程。通过缓存管理进程的设置,实现了缓存查询结果的内存的共享,多个的业务进程均可以通过缓存管理进程对缓存的查询结果进行访问,避免了为每个业务进程分配内存以及对每个内存进行独立操作造成的资源浪费。而且,数据库服务器在接收到查询请求消息时判断SQL查询命令对应的查询结果缓存是否有效,在有效时指示数据库客户端装置读取自己缓存查询结果,提高了数据查询的有效性。
图4为本发明实施例提供的第四种数据库查询方法流程图。如图4所示,在本实施例中,步骤S10,所述接收数据库客户端装置的第一业务进程发送的携带有结构查询语言SQL查询命令的查询请求消息之前,所述方法还可以包括:
步骤S30、接收所述数据库客户端装置的第二业务进程发送的携带有所述SQL查询命令的第二查询请求消息;
步骤S40、判断所述SQL查询命令对应的查询结果缓存是否有效,若否,则根据所述SQL查询命令查询到所述第一查询结果,将所述第一查询结果返回给所述数据库客户端装置的第二业务进程,以使所述第二业务进程将所述第一查询结果发送给所述缓存管理进程,所述缓存管理进程将所述第一查询结果存储到所述存储器,建立所述SQL查询命令与所述第一查询结果的对应关系。
数据库服务器判断SQL查询命令对应的查询结果缓存是否有效的方式可以有多种,例如可以设置与SQL查询命令对应的标志位,以记录该SQL查询命令对应的查询结果缓存是否有效,例如,有效时,标志位为1,无效时,标志位为0。SQL查询命令与标识位的对应关系形成结构体对象,可以通过但不限于数组或链表等形式对该结构体对象进行记录。
数据库服务器中可以设置有多个数据库,每个数据块中设置有多个表,每个表中设置有多个列。数据库服务器在第一次处理该SQL查询命令,可以为该SQL查询命令所对应的数据库、表和列分别注册数据库改变序列号(Database Change Number,简称DCN)、表改变序列号(Table ChangeNumber,TCN)和列改变序列号(Column Change Number,CCN)。改变数据库、表或列的事务提交后,相应将上述序列号的值改变,例如执行加1操作。因此,还可以根据DCN、TCN和CCN的变化情况判断SQL查询命令对应的查询结果缓存是否有效。
在本实施例中,所述判断所述SQL查询命令对应的查询结果缓存是否有效,具体可以包括:
若所述SQL查询命令所查询的数据库的数据库改变序列号的值没有发生变化,则所述SQL查询命令对应的查询结果缓存有效;或者,
若所述SQL查询命令所查询的数据库的数据库改变序列号的值发生变化,所述SQL查询命令所查询的表的表改变序列号的值没有发生变化,则所述SQL查询命令对应的查询结果缓存有效;或者,
若所述SQL查询命令所查询的数据库的数据库改变序列号和所述SQL查询命令所查询的表的表改变序列号的值发生变化,所述SQL查询命令所查询的列的列改变序列号的值没有变化,则所述SQL查询命令对应的查询结果缓存有效;或者,
若所述SQL查询命令所查询的列的列改变序列号的值发生变化,则所述SQL查询命令对应的查询结果缓存无效。
在实际应用过程中,可以在数据库的系统表sysdatabases,systables,
syscolumns分别增加DCN,TCN和CCN。可以首先检查当前系统的DCN与
上次查询时是否相同,若相同,则表明SQL查询命令对应的查询结果缓存有
效,若不相同,则检查当前系统的TCN和上次查询时是否相同,若相同,则
表明SQL查询命令对应的查询结果缓存有效,若不相同,则检查当前系统的
CCN和上次查询时是否相同,若相同,则表明SQL查询命令对应的查询结果
缓存有效,若不相同,则表明SQL查询命令对应的查询结果缓存无效。
在本实施例中,所述方法还可以包括:
步骤S50、接收数据修改指令,将所述数据修改指令对应的数据库的表的列的内容进行修改,将修改的数据库的数据库改变序列号、修改的表的表改变序列号和修改的列的列改变序列号的值分别加1。
具体地,数据修改指令可以是数据库客户端装置发送的,也可以是在数据库服务器数据更新或管理过程中发送的,用以改变数据库中的数据。
图5为本发明实施例提供的第一种数据库查询信令图,以下结合图5,对本发明实施例提供的数据库查询方法进行详细说明。
数据库客户端装置开启SQL result cache功能,首次通过业务进程1执行一个SQL查询任务,数据库客户端装置创建一个缓存管理进程,业务进程1和缓存管理进程建立连接;
步骤1、缓存管理进程初始化完成之后,向业务进程1返回确认信息;
步骤2、业务进程1根据当前的IP地址和一随机数生成一个客户端ID作为数据库服务器区分不同数据库客户端的方法,然后向数据库服务器发送SQL查询请求消息,其中,SQL查询请求消息携带有SQL查询命令;
步骤3、数据库服务器中没有SQL查询命令对应的标志位,也没有注册的DCN、TCN和CCN,则注册DCN、TCN和CCN,按照正常流程处理SQL查询命令,得到SQL查询结果;
步骤4、数据库服务器向数据库客户端装置的业务进程1返回SQL查询结果;
步骤5、业务进程1将SQL查询结果发送给缓存管理进程;
步骤6、缓存管理进程分配内存缓存该SQL查询结果;
步骤7、缓存管理进程向业务进程1发送SQL result cache已经建立的确认信息;
步骤8、业务进程1向数据库服务器发送SQL result cache建立成功的消息;
步骤9、数据库服务器记录下该SQL查询命令对应的标志位为1。
图6为本发明实施例提供的第二种数据库查询信令图,以下结合图6,对本发明实施例提供的数据库查询方法进行详细说明。
步骤1、数据库客户端装置的业务进程2向数据库服务器发送SQL查询请求消息,其中,SQL查询请求消息携带有与图5所示实施例相同的SQL查询命令;
步骤2、数据库服务器检查该SQL查询命令对应的标志位为1,比较当前系统的DCN、TCN和CCN和上次访问时的DCN、TCN和CCN,发现SQL查询结果无变化,向业务进程2发送通知消息,以通知业务进程2直接从存储器中取SQL查询结果;
步骤3、业务进程2向缓存管理进程发SQL查询命令;
步骤4、缓存管理进程根据SQL查询命令从存储器读取SQL查询结果;
步骤5、缓存管理进程将SQL查询结果返回给业务进程2。
图7为本发明实施例提供的第三种数据库查询信令图,以下结合图7,对本发明实施例提供的数据库查询方法进行详细说明。
步骤1、数据库客户端装置的业务进程3向数据库服务器发送SQL查询请求消息,其中,SQL查询请求消息携带有与图5所示实施例相同的SQL查询命令;
步骤2、数据库服务器检查该SQL查询命令对应的标志位为1,比较当前系统的DCN、TCN和CCN和上次访问时的DCN、TCN和CCN,发现SQL查询结果发生变化,记录该SQL查询命令对应的标志位为0,按照正常流程处理SQL查询命令,得到SQL查询结果;
步骤3、数据库服务器向数据库客户端装置的业务进程3返回SQL查询结果;
步骤4、业务进程3将SQL查询结果发送给缓存管理进程;
步骤5、缓存管理进程分配内存缓存该SQL查询结果;
步骤6、缓存管理进程向业务进程3发送SQL result cache已经建立的确认信息;
步骤7、业务进程3向数据库服务器发送SQL result cache建立成功的消息;
步骤8、数据库服务器记录下该SQL查询命令对应的标志位为1。
值得注意的是,业务进程1、业务进程2和业务进程3可以为不同的进程,也可以为同一进程。
图8为本发明实施例提供的第一种数据库客户端装置结构示意图。如图8所示,本实施例提供的数据库客户端装置具体可以实现本发明任意实施例提供的应用于数据库客户端装置的方法的各个步骤,具体实现过程在此不再赘述。本实施例提供的数据库客户端装置具体包括:第一业务进程单元11和缓存管理进程单元12;
所述第一业务进程单元11,用于向数据库服务器发送携带有结构查询语言SQL查询命令的第一查询请求消息,接收所述数据库服务器返回的、用以指示所述SQL查询命令对应的查询结果缓存有效的指示消息,向缓存管理进程单元12发送所述SQL查询命令;
所述缓存管理进程单元12,用于根据所述SQL查询命令从存储器获取第一查询结果,将所述第一查询结果返回给所述第一业务进程单元11。
具体地,第一业务进程单元11中运行有第一业务进程,缓存管理进程单元12中运行有缓存管理进程。
本实施例提供的数据库客户端装置,通过缓存管理进程的设置,实现了缓存查询结果的内存的共享,多个的业务进程均可以通过缓存管理进程对缓存的查询结果进行访问,避免了为每个业务进程分配内存以及对每个内存进行独立操作造成的资源浪费。而且,数据库服务器在接收到查询请求消息时判断SQL查询命令对应的查询结果缓存是否有效,在有效时指示数据库客户端装置读取自己缓存查询结果,提高了数据查询的有效性。
图9为本发明实施例提供的第二种数据库客户端装置结构示意图。如图9所示,在本实施例中,所述数据库客户端装置还可以包括:
第二业务进程单元13,用于向所述数据库服务器发送所述携带有所述SQL查询命令的第二查询请求消息,接收所述数据库服务器返回的、根据所述SQL查询命令查询到的所述第一查询结果,将所述有SQL查询命令和所述第一查询结果发送给所述缓存管理进程单元12;
相应地,所述缓存管理进程单元12,还用于将所述第一查询结果存储到所述存储器,建立所述SQL查询命令与所述第一查询结果的对应关系。
在本实施例中,所述缓存管理进程单元12,还用于对所述SQL查询命令进行哈希处理生成哈希值,将所述哈希值与链表对应存储在所述存储器中,其中,所述链表中记录有所述SQL查询命令与所述第一查询结果的存储地址的对应关系;对所述SQL查询命令进行哈希处理生成所述哈希值,根据所述哈希值从所述存储器中确定链表,根据所述SQL查询命令从所述链表中确定所述第一查询结果的存储地址,根据所述存储地址从所述存储器中获取所述第一查询结果。
在本实施例中,所述缓存管理进程单元12,还用于若判断获知所述存储器中还存储有所述SQL查询命令对应的第二查询结果,且没有业务进程读取所述第二查询结果,则将所述第二查询结果删除,并释放存储器中用于存储所述第二查询结果的存储空间。
图10为本发明实施例提供的第一种数据库服务器结构示意图。如图10所示,本实施例提供的数据库服务器具体可以实现本发明任意实施例提供的应用于数据库服务器的方法的各个步骤,具体实现过程在此不再赘述。本实施例提供的数据库服务器具体包括:
接收单元21,用于接收数据库客户端装置的第一业务进程发送的携带有结构查询语言SQL查询命令的第一查询请求消息;
处理单元22,用于判断所述SQL查询命令对应的查询结果缓存是否有效,若是,则向所述数据库客户端装置的业务进程发送用于指示所述SQL查询命令对应的查询结果缓存有效的指示消息,以使得所述数据库客户端装置的第一业务进程向所述数据库客户端装置的缓存管理进程发送所述SQL查询命令,所述缓存管理进程根据所述SQL查询命令从存储器获取第一查询结果,将所述第一查询结果返回给所述第一业务进程。
本实施例提供的数据库服务器,接收单元21接收数据库客户端装置的第一业务进程发送的携带有结构查询语言SQL查询命令的第一查询请求消息,处理单元22判断SQL查询命令对应的查询结果缓存是否有效,若是,则向数据库客户端装置的第一业务进程发送用于指示SQL查询命令对应的查询结果缓存有效的指示消息,以使得数据库客户端装置的第一业务进程向数据库客户端装置的缓存管理进程发送SQL查询命令,缓存管理进程根据SQL查询命令从存储器获取第一查询结果,将第一查询结果返回给第一业务进程。通过缓存管理进程的设置,实现了缓存查询结果的内存的共享,多个的业务进程均可以通过缓存管理进程对缓存的查询结果进行访问,避免了为每个业务进程分配内存以及对每个内存进行独立操作造成的资源浪费。而且,数据库服务器在接收到查询请求消息时判断SQL查询命令对应的查询结果缓存是否有效,在有效时指示数据库客户端装置读取自己缓存查询结果,提高了数据查询的有效性。
在本实施例中,所述接收单元21,还用于接收所述数据库客户端装置的第二业务进程发送的携带有所述SQL查询命令的第二查询请求消息;
所述处理单元22,还用于判断所述SQL查询命令对应的查询结果缓存是否有效,若否,则根据所述SQL查询命令查询到所述第一查询结果,将所述第一查询结果返回给所述数据库客户端装置的第二业务进程,以使所述第二业务进程将所述第一查询结果发送给所述缓存管理进程,所述缓存管理进程将所述第一查询结果存储到所述存储器,建立所述SQL查询命令与所述第一查询结果的对应关系。
在本实施例中,所述处理单元22,还用于若所述SQL查询命令所查询的数据库的数据库改变序列号的值没有发生变化,则所述SQL查询命令对应的查询结果缓存有效;或者,
若所述SQL查询命令所查询的数据库的数据库改变序列号的值发生变化,所述SQL查询命令所查询的表的表改变序列号的值没有发生变化,则所述SQL查询命令对应的查询结果缓存有效;或者,
若所述SQL查询命令所查询的数据库的数据库改变序列号和所述SQL查询命令所查询的表的表改变序列号的值发生变化,所述SQL查询命令所查询的列的列改变序列号的值没有变化,则所述SQL查询命令对应的查询结果缓存有效;或者,
若所述SQL查询命令所查询的列的列改变序列号的值发生变化,则所述SQL查询命令对应的查询结果缓存无效。
在本实施例中,所述接收单元21,还用于接收数据修改指令;
所述处理单元22,还用于将所述数据修改指令对应的数据库的表的列的内容进行修改,将修改的数据库的数据库改变序列号、修改的表的表改变序列号和修改的列的列改变序列号的值分别加1。
图11为本发明实施例提供的用于数据库客户端的计算机节点结构示意图。如图11所示,本实施例提供的用于数据库客户端的计算机节点700具体可以实现本发明任意实施例提供的应用于数据库客户端装置的方法的各个步骤,具体实现过程在此不再赘述。本实施例提供的用于数据库客户端的计算机节点700具体包括:处理器710,通信接口720,存储器730和通信总线740:其中所述处理器710、所述通信接口720和所述存储器730通过所述通信总线740完成相互间的通信;所述通信接口720,用于向数据库服务器发送携带有结构查询语言SQL查询命令的第一查询请求消息,接收所述数据库服务器返回的、用以指示所述SQL查询命令对应的查询结果缓存有效的指示消息;所述存储器730,用于存储指令和第一查询结果;所述处理器710被配置为执行存储在所述存储器730中的指令,其中,所述处理器710被配置为用于调用第一业务进程通过所述通信接口720向数据库服务器发送携带有结构查询语言SQL查询命令的第一查询请求消息,接收所述数据库服务器返回的、用以指示所述SQL查询命令对应的查询结果缓存有效的指示消息,向缓存管理进程发送所述SQL查询命令;调用所述缓存管理进程根据所述SQL查询命令从所述存储器获取所述第一查询结果,将所述第一查询结果返回给所述第一业务进程。
图12为本发明实施例提供的第二种数据库服务器结构示意图。如图12所示,本实施例提供的数据库服务器800具体可以实现本发明任意实施例提供的应用于数据库服务器的方法的各个步骤,具体实现过程在此不再赘述。本实施例提供的数据库服务器800具体包括:处理器810,通信接口820,存储器830和通信总线840:其中所述处理器810、所述通信接口820和所述存储器830通过所述通信总线840完成相互间的通信;所述通信接口820,用于接收数据库客户端装置的第一业务进程发送的携带有结构查询语言SQL查询命令的第一查询请求消息;向所述数据库客户端装置的业务进程发送用于指示所述SQL查询命令对应的查询结果缓存有效的指示消息;所述存储器830,用于存储指令;所述处理器810被配置为执行存储在所述存储器830中的指令,其中,所述处理器810被配置为用于判断所述SQL查询命令对应的查询结果缓存是否有效,若是,则通过所述通信接口向所述数据库客户端装置的业务进程发送用于指示所述SQL查询命令对应的查询结果缓存有效的指示消息,以使得所述数据库客户端装置的第一业务进程向所述数据库客户端装置的缓存管理进程发送所述SQL查询命令,所述缓存管理进程根据所述SQL查询命令从存储器获取第一查询结果,将所述第一查询结果返回给所述第一业务进程。
本发明实施例提供的数据库查询方法及设备,对于含有大量查询结果的SQL,可以显著降低网络开销,加快SQL查询的速度。对于含有order by,group by,distinct的SQL,可以显著降低服务端的CPU开销,加快SQL查询的速度。实现了不同访问源所执行的SQL查询任务可以共享查询结果,减少了查询结果的内存占用和缓存的更新次数。SQL查询命令对应的查询结果缓存的有效性检测是通过数据库客户端装置向数据库服务器请求检测的,能够保证从缓存中读取的数据是实时有效的。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。