发明内容
本发明实施例提供一种执行数据库操作命令的计算设备及方法,以提高数据库客户端访问数据库服务器的性能及可靠性。
第一方面,提供了一种执行数据库操作命令的计算设备,包括数据库客户端和数据库服务器,
所述数据库客户端,用于接收对所述数据库服务器管理的数据的操作命令,
确定所述操作命令请求的操作是否为读操作,
若所述操作命令请求的操作是读操作,通过对所述数据库服务器进程内存的授权访问,执行所述操作命令,获得查询结果;
若所述操作命令请求的操作不是读操作,转发所述操作命令到所述数据库服务器,以便所述数据库服务器执行所述操作命令。
在第一方面的第一种可能的实现方式中,所述数据库客户端具体包括连接接口,解析器及执行器:
连接接口,用于接收对所述数据库服务器管理的数据的操作命令,
解析器,用于解析所述连接接口接收的所述操作命令,确定所述操作命令请求的操作是否为读操作,若所述操作命令请求的操作是读操作,发送所述操作命令到所述执行器;若所述操作命令请求的操作不是读操作,转发所述操作命令到数据库服务器;
所述执行器,用于执行所述解析器发来的操作命令,通过对所述数据库服务器进程内存的授权访问获得查询结果。
结合第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述连接接口进一步用于获得数据库服务器进程内存的访问权限,以及申请数据库服务器建立一个代理线程。
第二方面,提供了一种执行数据库操作命令的方法,应用于数据库客户端,包括:
接收对数据库服务器管理的数据的操作命令,
确定所述操作命令请求的操作是否为读操作,
若所述操作命令请求的操作是读操作,通过对所述数据库服务器进程内存的授权访问,执行所述操作命令,获得查询结果;
若所述操作命令请求的操作不是读操作,转发所述操作命令到所述数据库服务器,以便数据库服务器执行所述操作命令请求的操作。
在第一方面的第一种可能的实现方式中,在所述执行所述操作命令前,还包括:获得所述数据库服务器进程内存的访问权限,以及申请数据库服务器建立一个代理线程。
结合第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述获得所述数据库服务器进程内存的访问权限之前进一步包括:确定满足以下条件中的一个或多个:
所述数据库客户端收到从应用程序发来的数据库连接请求中包含直连指示;
确定所述操作命令请求的操作是读操作。
第三方面,提供了一种计算机可读存储介质,其中保存有可被处理器执行的指令,使处理器处理数据库操作命令以,所述指令包括:
接收对数据库服务器管理的数据的操作命令,
确定所述操作命令请求的操作是否为读操作,
若所述操作命令请求的操作是读操作,通过对所述数据库服务器进程内存的授权访问,执行所述操作命令,获得查询结果;
若所述操作命令请求的操作不是读操作,转发所述操作命令到所述数据库服务器,以便数据库服务器执行所述操作命令请求的操作。
从本发明实施例提供的以上技术方案可以看出,数据库客户端确定所接收的操作命令请求的操作是否为读操作,如该操作命令请求的操作是读操作,通过对所述数据库服务器进程内存的授权访问,执行所述操作命令,获得查询结果;如所述操作命令请求的操作不是读操作,转发所述操作命令到数据库服务器,以便数据库服务器执行所述操作命令。通过在数据库客户端判断操作命令的类型,在读操作时采用高性能的直接访问数据库服务器进程内存,对于非读操作,如写操作,转发所述操作命令到数据库服务器,由数据库服务器执行操作命令,可屏蔽操作命令的发起方,如应用程序,异常时给数据库内部结构带来的风险,提高了可靠性。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。
在一本发明实施例中,为提高数据库的吞吐量,可将数据库客户端与数据库部署在同一台机器上,从而应用程序通过数据库客户端本地访问数据库服务器,避免了远程网络通信的开销。数据库客户端可使用直连方式访问数据库服务器,即,数据库客户端直接附着(attach)到数据库服务器进程内存,对数据库服务器进程内存进行访问,进一步提高数据库的吞吐量。数据库服务器进程指完成数据库客户端请求和数据库运行管理的进程。数据库服务器进程内存指为该进程所分配的内存。
但是,直连方式也存在可靠性的问题,由于数据库服务器进程的内部结构完全暴露给调用数据库客户端的应用程序,该应用程序的异常操作,例如指针越界访问,可能毁坏数据库服务器进程的内部结构,导致出现数据库崩溃并无法恢复。即使应用程序的编码符合规范,由于外部不可抗力,该应用程序退出,应用进程被强制关闭,仍然可能导致数据库数据修改不完整而引起的一致性问题。若对数据的修改记录细粒度的日志以便于恢复,日志量又可能太大。本发明的实施例通过确定某一操作命令是否属于读操作,对读操作,数据库客户端通过直连方式访问数据库服务器进程内存,对于非读操作,不使用直连方式,减小了破坏数据库服务器进程的内容结构的风险,提高了可靠性。
图1为本发明实施例的一个网络环境示意图。应用程序102指可提供各种特定功能的计算机程序,包括不限于计费应用,互联网浏览器,多媒体播放器等。应用程序可通过通信网络103访问数据库系统。多个应用程序可使用应用中间件104来调用数据库客户端106。数据库主机(database host)105包括数据库客户端106和数据库服务器108。数据库客户端106用于接收应用程序对于所述数据库服务器管理的数据的操作命令,连接并访问数据库服务器。特别地,在直连方式下,数据库客户端106可获得对数据库服务器进程内存的授权访问,执行操作命令。数据库服务器108用于管理数据并执行数据库客户端转发来的操作命令。进一步地,数据库主机105还与存储引擎110相连接。存储引擎110存储数据库中的数据,是结构化的数据集合。数据库客户端106或数据库服务器108可驱动存储引擎110,接收存储引擎返回的数据。举例来说,存储引擎110可以包含在数据库服务器108中,也可以位于数据库服务器外部的存储器中。
图2是本发明实施例提供的计算设备的示意性框图。本实施例中,计算设备可以为一计算机主机,具体包括一基于处理器的计算机,如通用个人计算机(PC),便携式设备如平板计算机,或智能手机。如图2所示,计算设备200可包括总线210,处理器202,存储器204,输入输出接口206,通信接口208。总线210可包括一通路,在计算机各个部件之间传送信息。处理器202用于处理信息,执行指令或操作,具体可以是一个通用中央处理器(CPU),微处理器,特定应用集成电路application-specific integrated circuit(ASIC),或一个或多个用于控制本发明方案程序执行的集成电路。计算设备还包括一个或多个存储器204,用于存储信息和指令,存储器可以是只读存储器read-onlymemory(ROM)或可存储静态信息和指令的其他类型的静态存储设备,随机存取存储器random access memory(RAM)或者可存储信息和指令的其他类型的动态存储设备,也可以是磁盘存储器。这些存储器通过总线210与处理器202相连接。
输入输出接口206可包括输入装置或输出装置。输入装置用以接收用户输入的数据和信息,例如键盘,鼠标、摄像头,扫描仪,光笔,语音输入装置,触摸屏等。输出装置用以允许输出或显示信息给用户,包括显示屏,打印机,扬声器等。计算设备还包括一个网络接口208,该网络接口使用任何收发器一类的装置,以便与其他设备或通信网络通信,如以太网,无线接入网(RAN),无线局域网(WLAN)等。处理器202也能通过总线210与输入输出接口206,网络接口208相连接。
存储器204保存有执行本发明方案的程序,包括数据库客户端212,数据库服务器214。存储器204中还可以保存操作系统和其他应用程序。数据库客户端212用于接收应用程序对于所述数据库服务器管理的数据的操作命令,确定所述操作命令请求的操作是否为读操作,若所述操作命令请求的操作是读操作,通过对所述数据库服务器进程内存的授权访问执行所述操作命令,获取查询结果;若所述操作命令请求的操作不是读操作,转发所述操作命令到所述数据库服务器,以便所述数据库服务器执行所述操作命令请求的操作。一般地,数据库客户端212的功能包括:建立到数据库服务器的连接(connect),准备(prepare)数据库操作命令,执行(execute)操作命令,获取(fetch)执行结果。数据库客户端212为应用程序提供统一的应用程序接口(API)。
数据库服务器214接收到数据库客户端212转发来的操作命令后,执行操作命令,返回执行结果。具体地,数据库服务器向数据库客户端提供数据库服务,例如查询、更新、事务管理、索引、高速缓存、查询优化、安全及多用户存取控制中一种或多种。本发明实施例中,数据库客户端212与数据库服务器214位于同一台服务器或主机上,即数据库客户端能本地连接数据库服务器。
图3为图2所示的数据库客户端、数据库服务器之间通信机制的示意图。如图3所示的实施例,数据库客户端310具体包括连接接口311,解析器312及执行器313。连接接口311用于接收对于所述数据库服务器管理的数据的操作命令。应用程序在需要操作数据库服务器管理的数据时,发送操作命令到数据库客户端,通过连接接口311调用数据库服务。连接接口311还用于建立数据库客户端与数据库服务器之间的连接,传送操作命令及对应的操作结果。操作命令可携带待操作的数据库服务器中的数据的版本号,该版本号用以识别是否数据库结构发生过改变。
解析器312解析连接接口311收到的数据库操作命令,将该操作命令编译成执行器313能识别的代码。作为一种实施方式,在解析操作命令时不需要发送操作命令给数据库服务器,而是直接在数据库客户端调用编译库完成。在本发明实施例中,编译某一操作命令后,解析器312确定该操作命令请求的是否为读操作,如果该操作命令请求的是读操作,则通过数据库客户端的执行器313对数据库服务器进程内存的授权访问314,执行所述操作命令,获取查询结果;如该操作命令请求的不是读操作,解析器312通过通信连接315转发所述操作命令到数据库服务器,以便数据库服务器执行所请求的操作。作为一种实施方式,解析器312以动态链接库的方式提供给数据库客户端供其调用。
数据库客户端的执行器313,用于执行(execute)解析器312发来的属于读操作的操作命令,通过对所述数据库服务器进程内存的授权访问314,执行所述操作命令,获得查询结果。执行器313获取数据库服务器进程内存的访问权限后,可以驱动数据库服务器的存储引擎323来执行操作命令,读取数据库中存储的数据,得到查询结果。数据库客户端获得数据库服务器进程内存访问权限的具体实现为:数据库客户端的执行器313附着(attach)到数据库服务器进程内存,获得数据库服务器进程内存的起始地址和偏移量。数据库客户端访问数据库服务器进程内存时采用起始地址加偏移量的方式寻址。
数据库服务器320包括执行器322、存储引擎323。数据库服务器的执行器322通过通信连接315接收解析器312编译后转发的操作命令,通过建立的代理线程访问数据库服务器进程内存,驱动存储引擎323执行所述操作命令,并将执行的结果返回给数据库客户端。具体地,在连接接口311建立通信连接315时,在执行器322中会建立一个代理线程,该代理线程可访问数据库服务器进程内存,驱动存储引擎323,执行所述操作命令。得到查询结果后,代理线程将查询结果拷贝到其通信缓冲中,再通过通信连接315将查询结果返回给数据库客户端。代理线程是数据库服务器进程为执行某一数据库客户端的操作请求所建立的实体,可共享数据库服务器进程的资源(如内存)。一个数据库服务器进程包含多个数据库客户端的代理线程及后台线程。存储引擎323,用于存储数据库中的数据,被所述执行器322驱动,返回所述执行器322执行的操作命令请求的数据。另外,存储引擎323也可被数据库客户端310的执行器313驱动,返回执行器313请求的数据。
数据库服务器320也可以包含有一个解析器(图3未示出)。在数据库客户端的连接接口311确定不使用直连方式时,如选择了TCP/IP方式与数据库服务器进行连接时,连接接口311会将操作命令直接发送给数据库服务器的解析器。数据库服务器的解析器接收数据库客户端的连接接口311转发的操作命令,将该操作命令解析成数据库服务器的执行器322能识别的代码。在一些场景下,例如数据库客户端与数据库服务器不在同一台主机上,或应用程序发来的数据库连接请求中指示不采用直连方式时,则可使用数据库服务器解析操作命令的方式。
数据库客户端的解析器312确定所述操作命令请求的操作是否为读操作具体可以为:确定所述操作命令请求的操作是否为一组预设读操作中的一项。预设读操作指一组预先指定的数据库的只读操作,不涉及对数据库中数据修改,或进行数据加工的查询。示例性的,只读操作的具体操作命令有:Select*from table where XXX;select字段from table where XXX。在操作命令为一项预设读操作的情况下,数据库客户端可获得数据库服务器进程内存的访问权限,即建立数据库客户端与数据库服务器的直连连接314。通过数据库客户端的执行器313直接对数据库服务器进程的内存进行访问,获得查询结果,无需请求数据库服务器的执行器322建立代理线程来执行操作命令,保证了高性能的数据读取。
在预设读操作以外的情况下,如涉及对数据库记录的增加,更新,删除,数据定义语言、数据控制语言的操作,由连接接口311申请数据库服务器建立一个代理线程,建立数据库客户端与数据库服务器之间的通信连接315。此时,不采用数据库客户端与数据库服务器直连的方式,数据库客户端不获得数据库服务器进程内存的访问权限。数据库客户端与数据库服务器之间的通信连接315可使用进程间通讯(IPC),TCP/IP协议,或domain socket中的一种机制来建立,实现解析器312与代理线程之间的通信。通过通信连接315,转发数据库客户端的操作命令从解析器312到数据库服务器的执行器322中的代理线程。再由该代理线程来完成预设读操作以外的这些数据库操作命令的执行。代理线程可直接对数据库服务器进程内存进行访问,得到操作结果。然后,代理线程将操作结果拷贝到代理线程的通信缓冲中,再通过通信连接315将操作结果返回给数据库客户端。该操作结果可能是查询数据的结果,也可能是表示操作是否成功的代码。
数据库客户端310与数据库服务器320之间的直连连接314或通信连接315可以在解析器确定操作命令请求的是一组预设读操作中的一项后由连接接口311建立,也可以在数据库客户端的连接接口311接收到应用程序发来数据库连接请求后建立。一般情况下,由于建立数据库客户端与数据库服务器之间的连接较为费时,并且直连连接或通信连接建立后,适用于整个数据库会话期间,用于执行多次数据库客户端与数据库服务器端的操作命令与操作结果的交互。而多个操作命令被解析后对应的查询类型可能有多种,既包括预设读操作,又包括非预设读操作。因此,在初始建立数据库客户端与数据库服务器之间的连接时,较优的方式是建立与数据库服务器的直接连接314,并建立一个备用的通信连接315。该通信连接315将操作命令从解析器312转发到数据库服务器的执行器322。如果仅简单地执行一次查询或明确后期查询均为预设读操作或非预设读操作,也可指定仅建立直连连接314或通信连接315中的一种。
举例而言,在数据库客户端的连接接口311接收到应用程序发来数据库连接请求后,连接接口311判断数据库客户端与数据库服务器在同一台主机或服务器上,满足建立直连连接的条件,则可自动建立与数据库服务器的直接连接314,并建立一个备用的通信连接315。
连接接口311若发现以下任一条件满足,则确定数据库客户端需要获得数据库服务器进程内存的访问权限:
一种是应用程序发来的数据库连接请求中包含直连指示direct connect。连接接口311根据该直连指示,获得数据库服务器进程内存的访问权限,即建立与数据库服务器的直连连接314。连接接口与数据库服务器还可建立一个备用的通信连接315。该通信连接315可以使用进程间通讯(IPC),传输控制协议/网际协议(TCP/IP),或域套接字(domain socket)中的一种方法建立,具体方法根据系统的事先配置决定。
第二种为数据库客户端中的解析器312确定操作命令请求的是否为读操作,如果该操作命令请求的是读操作,则连接接口311建立与所述数据库服务器的直连连接314;如该操作命令请求的不是读操作,连接接口311建立与该数据库服务器的通信连接315。
数据库客户端解析器312确定所述操作命令请求的操作是否为所述一组预设读操作中的一项的方法可以用以下方式来实现:解析器312将操作命令中的关键字与该组预设读操作中某一项操作的关键字进行比较,若相符,则确定所述操作命令为该组预设读操作中的一项;若不相符,更换该组预设读操作中的操作为另一项操作,返回将操作命令中的关键字与一项预设读操作的关键字比较的步骤,直至得到相符的结果或完成与所有预设读操作中操作的比较。作为另一种实施方式,解析器可以将操作命令中的关键字与预先指定的一组不属于预设读操作中的每一项操作中的关键字进行比较,若均不相符,则确定所述操作命令为读操作。
数据库客户端的解析器312确定操作命令请求的操作是否为读操作还可以采用另一种方式实现:解析器312根据操作命令的名称或属性确定所述操作命令请求的操作是否为读操作。在此种方式下,读操作命令有特定的名称或属性,可以据此判断是否是读操作。
事实上,对于OLTP系统来说,大部分的数据库操作命令为查询,其中多数又是简单的只读查询,如select字段或*from表where查询条件。本发明实施例通过将操作命令解析提前到数据库客户端,对于读操作使用直连连接以提高数据库性能。对于增删改等写操作,采用通信连接,如IPC连接,建立代理线程屏蔽应用程序异常给数据库内部结构带来的写坏风险,同时又保证了数据库系统的可靠性。
图4是本发明一个实施例提供的数据库查询方法的流程图。
在401步骤,数据库客户端接收对数据库服务器管理的数据的操作命令。
具体地,应用程序在需要处理数据库服务器管理的指定数据时,向数据库客户端发送操作命令。操作命令包括创建,查询,修改,更新等操作类型。
数据库客户端中解析器解析收到的操作命令,将操作命令编译成数据库客户端的执行器能理解的代码。作为一种实施方式,数据库客户端解析操作命令时,若操作命令中携带有待操作的数据库服务器中数据的版本号,获得操作命令相关的待操作数据对象的版本号,如表结构,列名的版本号。使用版本号的原因在于,由于操作命令的解析被前置到数据库客户端的解析器312进行,可能出现数据库客户端的执行器313或数据库服务器的执行器322执行操作命令时发现要查询的表的结构已被更改,例如字段被删或扫描要用的索引被删除,将导致操作异常。通过在操作命令中携带待操作数据对象的版本号,可使数据库客户端的执行器313或数据库服务器的执行器322在执行操作命令前判断从操作命令中获得的数据的版本号与存储引擎323中数据的版本号是否一致,减少异常的发生。
在402步骤,数据库客户端确定该操作命令请求的操作是否为读操作,若所述操作命令请求的操作是读操作,执行步骤403;若所述操作命令请求的操作不是读操作,执行步骤404。
确定所述操作命令请求的操作是否为读操作具体包括:确定所述操作命令请求的操作是否为一组预设读操作中的一项。预设读操作指一组预先指定的数据库只读操作,通过查询条件对数据库数据读取,如select字段或*from表where条件,不涉及对数据库中数据的修改,或进一步加工。预设读操作以外的,涉及对数据库数据更改的操作,包括增加(insert),更新(update),删除(delete),数据定义语言(DDL)、数据控制语言(DCL)的数据库操作。可选地,预设读操作以外的操作还包括查询数据后还需对查询到的原始数据做进一步计算分析的操作,如分组(group by),排序(order by),聚集,子查询。
数据库客户端确定该操作命令请求的是否为一组预设读操作中的一项,具体是将操作命令中的各关键字与该组预设读操作中某一项操作的关键字进行比较,发现有相符的情况则确定操作命令为一项预设读操作。举例来说,操作命令的关键字包括select,from,where,与一项预设读操作“select字段或*from表where条件”中关键字相符,则确定该操作命令请求的是该组预设读操作中的一项。而当操作命令的关键词包括delete时,则在预设读操作中未发现有相符的情况,确定该操作命令不属于该组预设读操作中的一项。
作为另一种实施方式,数据库客户端确定该操作命令请求的是否为读操作,具体是预先指定一组不属于预设读操作的操作语句,将操作命令的关键字与不属于预设读操作的各操作的关键字进行比较,若均不相符,则确定该操作命令请求的是读操作,若有相符的情况,则确定该操作命令不属于读操作。
确定操作命令请求的操作是否为读操作还可以采用另一种方式实现:根据操作命令的名称,或属性确定所述操作命令请求的操作是否为读操作。在此种方式下,读操作命令有特定的名称,或属性,可以据此判断是否为读操作。
在403步骤,通过与所述数据库服务器进程内存的授权访问,执行所述操作命令,获取查询结果。
在操作命令属于读操作的情况下,数据库客户端通过直接对数据库服务器进程内存进行访问,即通过与数据库服务器的直连连接,执行操作命令,读取所请求的数据。数据库客户端获得数据库服务器进程内存访问权限具体包括:数据库客户端附着(attach)到数据库服务器进程内存,获得数据库服务器进程内存的起始地址和偏移量。具体地,数据库客户端可调用数据库服务器的存储引擎来执行操作命令,读取数据库中的数据。
数据库客户端与数据库服务器之间的直连连接可以在确定操作命令是请求读操作后建立,也可以在数据库客户端的连接接口接收到应用程序发来数据库连接请求后建立。具体地,数据库客户端在接收到应用程序的数据库操作命令前收到应用程序发来的连接请求。数据库客户端确定满足以下条件中的一个或多个时,建立直连连接:应用程序发送的数据库连接请求中包含直连指示(direct connect),或数据库客户端确定操作命令请求的是读操作。更详细的描述参见前文实施例,不再赘述。
数据库客户端建立与数据库服务器之间的直连连接,则数据库客户端的进程直接附着(attach)到数据库服务器的服务进程内存,获得访问该数据库服务器进程内存的访问权限。其后在确定操作命令请求的操作是读操作时,访问该数据库服务器进程的内存,执行操作命令,读取相关数据。
在操作命令携带有待操作数据的版本号时,在执行操作命令之前,数据库客户端比较操作命令中携带的版本号与数据库服务器中保存的数据的版本号是否一致,如果不一致向数据库客户端返回错误码,要求重新解析该操作命令。数据库客户端访问数据库服务器进程内存,重新解析所述操作命令,得到待操作数据对象的当前的版本号,对操作命令解析后重新向数据库客户端执行器313发送操作命令,携带待操作数据对象的最新的版本号。采用这种方式,避免数据库客户端在解析操作命令的过程中,数据库数据结构改变造成的异常问题。
由于不同数据库客户端附着到数据库服务器服务进程的起始地址各不同,因此,数据库服务器进程内存中对各附着的数据库客户端进程都登记了对应的偏移量,数据库客户端获得所述数据库服务器进程内存的起始地址和偏移量,访问数据库服务器进程内存时采用起始地址+偏移量的方式寻址所述数据库服务器端服务进程的内存,从而保证了直连寻址的正确性。
数据库客户端得到查询结果后,数据库客户端的进程解附着(detach)数据库服务器服务进程的内存,即释放直连连接。
作为一种实施方式,在读操作中,有一类是全表字段查询,例如以下操作命令:
Select*from表where查询条件;
Select字段1,字段2,…(表中所有字段)from表where查询条件;
这类全表字段查询操作命令的共同点是,查询的是表中所有字段,且不需要参与四则运算或函数运算。在数据库服务器进程内存中,用于存储操作命令的执行结果的区域被称作游标。对于全表字段查询操作命令,数据库客户端有权限访问所述数据库服务器进程内存时,可以从数据库服务器进程内存中获得该被查询的表的游标的地址,直接访问该游标,整行读取,逐一从游标中获取表记录,进一步提高读数据的性能。
数据库客户端解析操作命令时,会识别出这类全表操作命令并登记到该操作命令相关的语句句柄上。语句句柄是数据库客户端为操作命令分配的内存区,用于记录一项操作命令的相关信息,例如,操作命令中的字段标识。操作命令查询的表中的各字段对应有查询标识ID,在数据库服务器存储时各字段对应有存储ID。由于操作命令中各字段的先后顺序与数据库服务器进程内存中各字段的存储顺序可能不一致,因此语句句柄上不仅要登记各字段的查询ID(如Q1,Q2),还要在校验(verify)时通过检索数据字典将对应字段的存储ID(如M1,M2)记下来,建立存储ID与查询ID的映射关系(如Q1-M2,Q2-M1)。校验时同时登记字段类型和长度,是否有效等信息。数据库客户端整行读取中表中记录时,记录中各字段是按存储ID的顺序排列。向应用程序返回查询结果时,可以根据查询ID与存储ID的映射关系,调整记录中各字段的顺序为操作命令中的字段的顺序,返回和显示查询结果。
在404步骤,数据库客户端转发所述操作命令到数据库服务器,以便数据库服务器执行该操作命令请求的操作。
在读操作以外的情况下,如涉及对数据库的增加,修改,更新,删除,数据定义语言、数据控制语言的操作,则数据库客户端通过通信连接315,转发解析后的操作命令到数据库服务器,由数据库服务器建立的代理线程访问数据库服务器进程内存,执行所述操作命令。代理线程得到操作结果后,将操作结果拷贝到代理线程的通信缓冲中,再通过通信连接315将操作结果返回给数据库客户端。通信连接315使用进程间通讯(IPC),TCP/IP,或domainsocket等方式建立,具体建立方法采用现有的技术根据具体的协议类型而建立。
数据库客户端与数据库服务器之间的通信连接315可以在确定操作命令不是读操作后建立,也可以在数据库客户端接收到应用程序发来数据库连接请求后建立。具体地,触发建立通信连接315的条件包括以下条件中一个或多个:应用程序发送的数据库连接请求中未包含直连连接指示,或数据库客户端确定操作命令请求的不是读操作。更详细的描述参见前文实施例,不再赘述。
数据库服务器接收到数据库客户端发来的非读操作的操作命令后,建立一个代理线程,由该代理线程访问数据库服务器进程内存,调用数据库服务器中的存储引擎322执行操作命令请求的操作,得到查询结果。查询结果可以从数据库服务器进程内存放入到代理线程的通信缓冲中,再通过通信连接315将查询结果返回给数据库客户端,由数据库客户端将查询结果返回给应用程序。
采用以上实施方式,数据库客户端确定操作命令是否是读操作,对于读操作可直接访问数据库服务器进程内存,提高了读性能;对于非读操作,通过通信连接将操作命令转发给数据库服务器,由数据库服务器建立代理线程执行操作命令,提高了可靠性。
图5为另一本发明实施例提供的数据库查询方法的流程图。
在501步骤,应用程序向数据库客户端发送数据库连接请求,所述连接请求中携带有直连指示direct connect。
在502步骤,根据连接请求中的直连指示,数据库客户端建立与数据库服务器的直连连接及备用的IPC通信连接。建立直连连接的方式具体为数据库客户端获得数据库服务器进程内存的访问权限。建立IPC连接的方式具体为通过IPC机制建立数据库客户端与数据库服务器之间的通信连接,由数据库服务器建立一个代理线程,由代理线程对数据库服务器进程内存进行访问。IPC机制包括管道,消息队列或信号等具体方法。
在503步骤,应用程序向数据库客户端发送数据库操作命令;
在504步骤,数据库客户端解析所述操作命令,确定操作命令请求的操作是否为预设读操作中一项,如是预设读操作中的一项,则执行步骤505,如不是预设读操作中的一项,则执行步骤507。
举例来说,操作命令为“select field A,field B from table1where condition1”,通过比较操作命令中的关键字“select”,“from”,“where”与预设读操作中各项操作的关键字,发现与预设读操作中有一项相符,则确定所述操作命令所请求的操作为预设读操作中的一项。在本实施例中,预设读操作具体包括只读查询,并且不包括带有group by,order by的select语句。
作为另一例,操作命令为“delete from table2where filed3=C”,数据库客户端解析所述操作命令,比较操作命令中的关键字“delete”与预设读操作中各项操作的关键字,与各项预设读操作的关键字均不相符,确定所述操作不为预设读操作中的一项。
在505步骤,数据库客户端直接访问数据库服务器进程内存,驱动存储引擎,获取查询结果,例如,操作命令为“select field A,field B from table1where condition1”时,获得table1中满足condition1的field A,field B列的数据。
在506步骤,数据库客户端向应用程序返回查询结果。
在507步骤,数据库客户端通过IPC连接将该不属于预设读操作的操作命令转发给数据库服务器,具体发送到数据库服务器执行器中的代理线程。
该代理线程驱动存储引擎,执行该操作命令,得到操作结果。例如操作命令为“delete from table2where filed3=C”时,数据库服务器执行删除table2中field3=C的行的操作,代理线程返回一个结果码表示执行成功或失败给数据库客户端。
在508步骤,数据库客户端接收数据库服务器返回的操作结果,并返回该结果给应用程序。由于没有查询数据返回,仅有结果码,用于将数据库服务器内存中数据拷贝到代理线程的通信缓冲及将通信缓冲中数据发送给数据库客户端的通信开销很小。
如图6所示,本发明实施例还提供一种数据库客户端,用于执行前述数据库查询方法,该数据库客户端包括:接收单元601,判断单元603,获取单元605,转发单元607。
接收单元601,用于接收对数据库服务器管理的数据的操作命令;
判断单元603,用于确定所述接收单元接收的所述操作命令请求的操作是否为读操作;
获取单元605,用于在判断单元603确定所述操作命令请求的操作是读操作时,通过对所述数据库服务器进程内存的授权访问,执行所述操作命令,获得查询结果;
转发单元607,用于在判断单元603确定所述操作命令请求的操作不是读操作时,转发所述操作命令到所述数据库服务器,以便数据库服务器执行所述操作命令请求的操作。
接收单元601进一步用于获得所述数据库服务器进程内存的访问权限,以及申请数据库服务器建立一代理线程。获得所述数据库服务器进程内存的访问权限,即建立所述数据库客户端与所述数据库服务器的直连连接。申请数据库服务器建立一代理线程还包括,建立所述数据库客户端与所述数据库服务器之间的通信连接。所述通信连接具体可使用进程间通讯,传输控制协议/网际协议,或域套接字中的一种方式建立。
接收单元601进一步用于确定满足以下一个或多个条件则确定需获得数据库服务器进程内容的访问权限:
所述数据库客户端收到从应用程序发来的数据库连接请求中包含直连指示;
数据库客户端确定所述操作命令请求的操作是读操作。
所述判断单元603确定操作命令请求的操作是否为读操作具体包括:所述判断单元603将所述操作命令中的关键字与一组预设读操作中一项操作的关键字进行比较,若相符,则确定所述操作命令为该组预设读操作中的一项;或,将所述操作命令中的关键字与预先指定的一组不属于预设读操作的每一项操作中的关键字进行比较,若不相符,则确定所述操作命令为读操作;或根据所述操作命令的名称或属性确定所述操作命令请求的操作是否为读操作。
数据库客户端各单元具体功能的实施与图4所示的实施例相同,此处不再赘述。
通过本发明实施例的数据库客户端,在判断单元确定操作命令请求的操作是读操作时,通过对所述数据库服务器进程内存的授权访问获得查询结果,以实现预设读操作时的高性能;在判断单元确定所述操作命令请求的操作不是读操作时,转发所述操作命令到所述数据库服务器,以便数据库服务器执行所述操作命令请求的操作,保证高风险操作的可靠性。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
上述装置和系统内的各单元之间的信息交互、执行过程等内容,由于与本发明方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本文中应用了具体实施例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。