数据库访问方法和装置制造方法

文档序号:6523523阅读:160来源:国知局
数据库访问方法和装置制造方法
【专利摘要】本发明公开了一种数据库访问方法和装置;其中的方法包括:接收来自客户端的数据库访问请求;判断所述客户端当前是否具有数据库连接;在所述客户端当前不具有数据库连接的情况下,从连接池中选取数据库连接,并提供给所述客户端;基于所述客户端当前具有的数据库连接执行所述数据库访问请求;在所述数据库访问请求执行完成后,判断所述客户端当前是否具有未释放的锁;如果所述客户端当前具有未释放的锁,则为所述客户端保持所述数据库连接,否则,将所述数据库连接回收至所述连接池中。
【专利说明】数据库访问方法和装置
【技术领域】
[0001]本发明涉及数据库访问技术,具体涉及一种数据库访问方法以及数据库访问装置。
【背景技术】
[0002]客户端对数据库的访问通常包括建立数据库连接、打开数据库、数据存取以及关闭数据库连接等操作,其中,建立数据库连接以及打开数据库操作等会消耗大量的系统资源以及时间。目前,为了节约系统资源以及时间,在数据库访问过程中引入了连接池技术。
[0003]基于连接池的数据库访问的实现方式通常为:在连接池中存储多条已经建立好的数据库连接,针对来自客户端的数据库访问请求,从连接池中获取一条数据库连接,并将该数据库连接提供给客户端;在数据库访问请求执行完成后,该数据库连接被回收至连接池中;后续,针对来自客户端(可以为前次发送数据库访问请求的客户端,也可以为其他客户端)的数据库访问请求,从连接池中获取一条数据库连接(可以是前次获取的数据库连接,也可以为其他数据库连接),并将该数据库连接提供给客户端,同样的,在数据库访问请求执行完成后,该数据库连接被回收至连接池中。
[0004]由上述描述可知,在引入连接池技术后,在数据库的数据存取操作完成后,客户端所使用的数据库连接并没有被关闭,而是被存储在连接池中,且存储在连接池中的数据库连接会被再次使用,即连接池中的数据库连接得到了复用,避免了反复建立数据库连接以及反复关闭数据库连接的操作,从而节约了系统资源以及时间。
[0005]由于数据库访问请求中的SQL语句可能是加锁的SQL语句、解锁的SQL语句或者不涉及加解锁的SQL语句(可以称为普通的SQL语句),因此,在引入连接池技术后,数据库访问会存在锁权限管理疏漏问题;一个具体的例子,图1中,第一客户端通过连接池中的第一数据库连接与MySQL数据库连接,第二客户端通过连接池中的第二数据库连接与MySQL数据库连接;第一客户端请求执行SELECT GET_L0CK (‘lockl’,0)的SQL语句,第二客户端请求执行SELECT GET_L0CK (‘lock2’,0)的SQL语句;这两条SQL语句被执行后,第一客户端获得锁lockl,第二客户端获得锁lock2,且第一数据库连接和第二数据库连接被回收到连接池中;在第一客户端和第二客户端请求执行SELECT RELEASE_L0CK( ‘lock2’)及SELECT RELEASE_L0CK(‘lockl’)的SQL语句之前,如果第一客户端请求执行SELECT GET_LOCK (‘lock2’,O)的 SQL 语句,或者第二客户端请求执行 SELECT GET_L0CK (‘lockl,,0)的SQL语句,则由于锁的状态是和数据库连接绑定的,因此,在为第一客户端分配的数据库连接为前述第一数据库连接,为第二客户端分配的数据库连接为前述第二数据库连接,则第一客户端会获得锁lock2,第二客户端会获得锁lockl。然而,正确的处理结果应该为第一客户端和第二客户端均被阻塞,从而第一客户端不能够获得锁lock2,第二客户端不能够获得锁lockl。
[0006]为了避免数据库访问中的锁权限管理疏漏的问题,现有的解决方案通常为:使客户端在运行期间独占一个数据库连接,直到该客户端退出后,该数据库连接才会被回收至连接池中,这样,在客户端运行期间,该客户端所有加锁的SQL语句、解锁的SQL语句以及普通的SQL语句都会基于同一数据库连接而被执行,从而该客户端获得的锁不会被其他客户
端获得。
[0007]发明人在实现本发明过程中发现,上述基于独占数据库连接的解决方案会使数据库连接的复用度大大降低,具体而言,客户端在运行期间除了请求执行SQL语句之外还需要执行其他逻辑,从而在客户端请求执行两条SQL语句之间会存在时间间隔,在该时间间隔内,客户端所占用的数据库连接既没有被回收到连接池中,也没有被该客户端充分利用。由上述描述可知,数据库连接的复用度有待于进一步提高。

【发明内容】

[0008]鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的数据库访问方法以及相应的数据库访问装置。
[0009]依据本发明的一个方面,提供了一种数据库访问方法,该方法包括:接收来自客户端的数据库访问请求;判断客户端当前是否具有数据库连接;在客户端当前不具有数据库连接的情况下,从连接池中选取数据库连接,并提供给所述客户端;基于所述客户端当前具有的数据库连接执行所述数据库访问请求;在所述数据库访问请求执行完成后,根据存储的所述客户端对应的锁信息判断所述客户端当前是否具有未释放的锁;如果所述客户端当前具有未释放的锁,则为所述客户端保持所述数据库连接,否则,将所述数据库连接回收至所述连接池中。
[0010]根据本发明的另一方面,提供了一种数据库访问装置,其中,所述装置包括:接收模块,适于接收来自客户端的数据库访问请求;判断模块,适于判断所述客户端当前是否具有数据库连接;选取连接模块,适于在所述客户端当前不具有数据库连接的情况下,从连接池中选取数据库连接,并提供给所述客户端;处理模块,适于基于所述客户端当前具有的数据库连接执行所述数据库访问请求;连接回收模块,适于在数据库访问请求执行完成后,根据存储的所述客户端对应的锁信息判断所述客户端当前是否具有未释放的锁,如果所述客户端当前具有未释放的锁,则为所述客户端保持所述数据库连接,否则,将所述数据库连接回收至所述连接池中。
[0011]本发明的数据库访问方法和装置通过在客户端的数据库访问请求执行完成后,判断该客户端当前是否具有未释放的锁,且在确定出该客户端当前具有未释放的锁的情况下,不将该数据库连接回收至连接池中,而是继续由该客户端占用;这样,可以避免该客户端具有的锁由于与数据库连接绑定且该数据库连接被分配给其他客户端而被其他客户端获得的可能性;从而本发明在解决了连接池中的数据库连接复用而带来的锁权限问题的情况下,在一定程度上提高了连接池内的数据库连接的复用度。
[0012]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】。
【专利附图】

【附图说明】
[0013]通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。说明书附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0014]图1示出了数据库访问的网络构架示意图;
[0015]图2示出了根据本发明实施例一的数据库访问方法流程图;
[0016]图3示出了根据本发明实施例二的数据库访问方法流程图;
[0017]图4示出了根据本发明实施例三的数据库访问装置示意图。
【具体实施方式】
[0018]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0019]实施例一、数据库访问方法。下面结合图2对本实施例的方法进行详细说明。
[0020]图2中,S200、接收来自客户端的数据库访问请求。
[0021]具体的,该数据库访问请求中的SQL语句可以为加锁的SQL语句,也可以为解锁的SQL语句,还可以为不涉及加解锁的SQL语句(下述简称为普通的SQL语句)。这里的SQL语句可以为基于MYSQL的SQL语句。
[0022]S210、判断该客户端当前是否具有数据库连接,在确定出该客户端当前不具有数据库连接的情况下,到S220,在确定出该客户端当前具有数据库连接的情况下,到S230。
[0023]具体的,本实施例可以根据本地存储的信息来判断该客户端当前是否具有数据库连接,例如,判断本地是否存储有与该客户端对应的连接标识信息(如是否存储有客户端标识与数据库连接的连接标识的对应关系信息),如果本地存储有与该客户端对应的连接标识信息(如本地存储有客户端标识与数据库连接的连接标识的对应关系信息),则表示该客户端当前具有数据库连接,如果本地未存储有与该客户端对应的连接标识信息(如本地没有存储客户端标识与数据库连接的连接标识的对应关系信息),则表示该客户端当前不具有数据库连接;再例如,判断本地存储的该客户端对应的当前数据库连接标志位的取值,在确定出该数据库连接标志位的取值为第一预定值(如I或者true等)时,则表示该客户端当前具有数据库连接,在确定出该数据库连接标志位的取值为第二预定值(如O或者false等)时,则表示该客户端当前不具有数据库连接。
[0024]本实施例还可以采用其他方式来判断该客户端当前是否具有数据库连接,具体的判断方式不再详细举例说明。
[0025]S220、从连接池中选取数据库连接,并提供给该客户端。
[0026]具体的,在确定出该客户端当前不具有数据库连接的情况下,应从连接池中选取一条数据库连接,并将该选取的数据库连接提供给该客户端;也就是说,本实施例会为当前不具有数据库连接的该客户端分配一条已建立好的且存储于连接池中的数据库连接。本实施例可以采用现有的连接分配策略(或者称为数据库连接选取策略)从连接池中为该客户端选取一条数据库连接。
[0027]在前述步骤S210中,如果根据本地存储的与该客户端对应的连接标识信息来判断该客户端当前是否具有数据库连接,则在本步骤中,从连接池中选取一条数据库连接并提供给该客户端之后,应在本地存储本次选取的数据库连接的连接标识信息,如存储该客户端标识与本次选取的数据库连接的连接标识的对应关系信息。
[0028]在前述步骤S210中,如果根据本地存储的为该客户端设置的当前数据库连接标志位的取值来判断该客户端当前是否具有数据库连接,则在本步骤中,从连接池中选取一条数据库连接并提供给该客户端之后,应将本地存储的为该客户端设置的当前数据库连接标志位的取值设置为第一预定值,如设置为I或者true等。
[0029]S230、基于客户端当前具有的数据库连接执行上述数据库访问请求。
[0030]具体的,客户端当前具有的数据库连接可以是利用前述步骤S220为该客户端分配的数据库连接,也可以是不需要执行前述步骤S220,而该客户端已经具有的数据库连接。
[0031]基于该客户端当前具有的数据库连接执行数据库访问请求可以具体为执行加锁的SQL语句,也可以为执行解锁的SQL语句,还可以为执行普通的SQL语句。
[0032]在本次执行的SQL语句为加锁的SQL语句的情况下,通常在该SQL语句执行前/后,客户端会获得相应的锁,例如,客户端请求执行SELECT GET_L0CK (‘lockl’,0)的SQL语句,该SQL语句在被执行前,客户端获得锁1ckl。
[0033]在本实施例中,在客户端获得锁时,应维护该客户端对应的锁信息,例如,存储该锁的锁名称,再如,增加其存储的该客户端当前拥有的锁的数量等;在存储锁名称的情况下,可以将客户端当前获得的锁名称添加在该客户端对应的锁名称集合中;在增加该客户端当前拥有的锁的数量的情况下,可以将该客户端当前拥有的锁的数量加I。另外,在本实施例中的客户端还对应有锁状态标识的情况下,在将客户端当前获得的锁名称添加在该客户端对应的锁名称集合中时,应对应设置该客户端对应的锁状态标识的取值。上述锁状态标识用于表示其对应的客户端当前是否拥有锁,即可以表示出该客户端当前是处于锁中,还是处于锁外。该锁状态标识可以是布尔型变量。需要特别说明的是,本实施例中的锁状态标识并不能用于表示客户端当前所拥有的锁的数量。
[0034]在本次执行的SQL语句为解锁的SQL语句的情况下,在该SQL语句执行前/后,客户端会释放相应的锁,例如,客户端请求执行SELECT RELEASE_L0CK ( ‘lockl’)的SQL语句,该SQL语句在被执行后,客户端释放其当前拥有的锁lockl。
[0035]在本实施例中,在客户端释放其当前拥有的一个锁或者多个锁时,同样应维护该客户端对应的锁信息;如删除已存储的该锁的锁名称,再如,减小其存储的该客户端当前拥有的锁的数量等;在删除锁名称的情况下,可以从该客户端对应的锁名称集合中删除该客户端当前释放的锁的锁名称;在减小该客户端当前拥有的锁的数量的情况下,可以将该客户端当前拥有的锁的数量减I。另外,在本实施例中的客户端还对应有锁状态标识的情况下,在将客户端当前释放的锁的锁名称从该客户端对应的锁名称集合中删除时,应对应设置该客户端对应的锁状态标识的取值,如该客户端对应的锁名称集合中没有任何锁名称时,将锁状态标识设置为表示该客户端目前处于锁外状态的取值,再如,该客户端对应的锁名称集合中还存在至少一个锁名称时,将锁状态标识设置为表示该客户端处于锁中状态的取值。
[0036]在本次执行的SQL语句为普通的SQL语句的情况下,在该SQL语句执行完成前/后,应不会针对该SQL语句执行与该客户端对应的锁信息的相关操作。
[0037]本实施例中的锁名称集合可以具体表现为锁信息记录表的形式;一个具体的例子,每一个客户端分别对应一个锁信息记录表,如每一个客户端标识分别对应有一个锁信息记录表,该锁信息记录表中至少包含有锁名称;如果本次执行的SQL语句为加锁的SQL语句,则在该SQL语句执行前/后,可以根据客户端标识查找到相应的锁信息记录表,并将该客户端当前获得的锁名称添加在查找到的该锁信息记录表中;如果本次执行的SQL语句为解锁的SQL语句,则在该SQL语句执行前/后,可以根据客户端标识查找到相应的锁信息记录表,并从查找到的该锁信息记录表中删除该客户端当前释放的锁的锁名称。另一个具体的例子,所有客户端对应同一个锁信息记录表,该锁信息记录表中应至少包含有客户端标识和锁名称;在该锁信息记录表中的一条记录包含有一个客户端当前拥有的所有锁的锁名称的情况下,如果本次执行的SQL语句为加锁的SQL语句,则在该SQL语句执行前/后,可以根据该客户端的客户端标识在锁信息记录表中查找相应的记录,并在查找到的该记录中追加该客户端当前获得的锁的锁名称;如果本次执行的SQL语句为解锁的SQL语句,则在该SQL语句执行前/后,可以根据客户端标识在锁信息记录表中查找相应的记录,并从查找到的该记录中删除该客户端当前释放的锁的锁名称。再一个具体的例子,所有客户端对应同一个锁信息记录表,该锁信息记录表中应至少包含有客户端标识和锁名称;在客户端拥有N个锁而该客户端在锁信息记录表中对应有N条记录的情况下,如果本次执行的SQL语句为加锁的SQL语句,则在该SQL语句执行前/后,可以根据该客户端的客户端标识和该客户端当前获得的锁的锁名称在锁信息记录表中追加一条记录;如果本次执行的SQL语句为解锁的SQL语句,则在该SQL语句执行前/后,可以根据客户端标识和该客户端当前释放的锁的锁名称在锁信息记录表中查找匹配的记录,并将查找到的该匹配的记录从锁信息记录表中删除。
[0038]在本实施例为每个客户端分别设置一个锁状态标识的情况下,锁状态标识的具体取值应与锁名称在锁名称集合中的添加操作以及删除操作相关。
[0039]—个具体的例子,在每一个客户端分别对应有一个锁信息记录表的情况下,每个锁信息记录表分别对应有一个锁状态标识,该锁状态标识可以表示出与其对应的锁信息记录表为空,还是为非空;在本次执行的SQL语句为加锁的SQL语句的情况下,在该SQL语句执行完成,且将该客户端当前获得的锁名称添加在该客户端对应的锁信息记录表中之后,应将该锁状态标识的取值设置为第一值(如I或者true),以表示该锁信息记录表为非空,即该客户端当前拥有至少一个锁;在本次执行的SQL语句为解锁的SQL语句的情况下,在该SQL语句执行完成,且从该客户端对应的锁信息记录表中删除该客户端当前释放的锁的锁名称之后,应将该锁状态标识的取值设置为第二值(如O或者false),以表示该锁信息记录表为空,即该客户端当前没有拥有锁。
[0040]另一个具体的例子,在本实施例中的所有客户端对应同一个锁信息记录表的情况下,每个客户端分别对应有一个锁状态标识,锁状态标识可以表示出锁信息记录表中是否包含有该客户端标识对应的锁名称;在本次执行的SQL语句为加锁的SQL语句的情况下,在该SQL语句执行完成,且将该客户端当前获得的锁名称添加在该客户端对应的锁信息记录表中之后,应将该锁状态标识的取值设置为第一值(如I或者true),以表示该锁信息记录表中包含有该客户端标识对应的锁名称,即该客户端当前拥有至少一个锁;在本次执行的SQL语句为解锁的SQL语句的情况下,在该SQL语句执行完成,且从该客户端对应的锁信息记录表中删除该客户端当前释放的锁的锁名称之后,应判断该锁信息记录中是否仍包含有该客户端对应的锁名称,如果仍然包含有该客户端对应的锁名称,则将该客户端对应的锁状态标识的取值设置为第一值(如I或者true),以表示该锁信息记录表中包含有该客户端对应的锁名称,即该客户端当前拥有至少一个锁;如果该锁信息记录表中不再包含有该客户端对应的锁名称,则应将该客户端对应的锁状态标识的取值设置为第二值(如O或者false),以表示该锁信息记录表中没有包含有该客户端对应的锁名称,即该客户端当前没有拥有锁。
[0041]需要特别说明的是,上述维护该客户端对应的锁信息的具体过程可以在执行数据库访问请求之前执行,也可以在执行数据库访问请求之后执行,当然,本实施例也不排除锁信息维护步骤与数据库访问请求执行步骤并行执行的可能性。
[0042]S240、在数据库访问请求执行完成后,根据存储的该客户端对应的锁信息判断该客户端当前是否具有未释放的锁,如果该客户端当前具有未释放的锁,则到S250,如果该客户端当前不具有未释放的锁,则到S260。
[0043]具体的,本实施例是根据当前已存储的该客户端对应的锁信息来判断该客户端当前是否具有未释放的锁,该锁信息可以为锁名称、锁的数量或者锁状态标识。
[0044]—个具体的例子,在每一个客户端分别对应有各自的一个锁信息记录表的情况下,本实施例可以判断已打开的该客户端对应的锁信息记录表中是否包含有锁名称,如果该锁信息记录表中包含有锁名称,则确定出该客户端当前具有未释放的锁,如果该锁信息记录表中没有包含有锁名称,则确定出该客户端当前不具有未释放的锁。
[0045]另一个具体的例子,在所有的客户端均对应同一个锁信息记录表的情况下,本实施例可以判断已打开的锁信息记录表中是否包含有该客户端对应的锁名称,如果该锁信息记录表中包含有该客户端对应的锁名称,则确定出该客户端当前具有未释放的锁,如果该锁信息记录表中没有包含该客户端对应的锁名称,则确定出该客户端当前不具有未释放的锁。
[0046]第三个具体的例子,在每一个客户端分别对应有各自的锁的数量的情况下,本实施例可以判断该客户端对应的锁的数量的当前值,如果该当前值不为初始值(初始值标识客户端当前不具有未释放的锁),则确定出该客户端当前具有未释放的锁,如果该当前值为初始值,则确定出该客户端当前不具有未释放的锁。
[0047]第四个具体的例子,在每一个客户端分别对应有各自的锁状态标识的情况下,可以判断该客户端对应的锁状态标识的取值,如果该客户端对应的锁状态的取值为第一值,则确定出该客户端当前具有未释放的锁,如果该客户端对应的锁状态的取值为第二值,则确定出该客户端当前不具有未释放的锁。
[0048]S250、为该客户端保持该数据库连接。
[0049]具体的,针对该客户端,不执行释放该客户端当前具有的数据库连接的操作;一个具体的例子,仍为该客户端保留本地存储的与该客户端对应的连接标识信息,如客户端标识与数据库连接的连接标识的对应关系信息。
[0050]由于该数据库连接仍然被保持而不是被回收至连接池中,因此,该客户端的下一条数据库访问请求仍然会基于该数据库连接而被执行。
[0051]S260、将数据库连接回收至连接池中。
[0052]具体的,针对该客户端,执行释放该客户端当前具有的数据库连接的操作,以使该数据库连接被回收至连接池中;一个具体的例子,删除本地存储的与该客户端对应的连接标识信息,如删除本地存储的客户端标识与数据库连接的连接标识的对应关系信息。
[0053]由于该数据库连接被回收至连接池中,因此,针对该客户端的下一条数据库访问请求,会重新从连接池中选取数据库连接,并基于重新选取的数据库连接而被执行。
[0054]由上述描述可知,本实施例仅在客户端当前仍具有锁的情况下,才不会将该客户端对应的数据库连接回收至连接池中,由于客户端的数据库访问请求中的加锁SQL语句的数量在所有SQL语句中所占的比例很低,因此,本实施例对数据库连接的复用度的影响非常小。
[0055]实施例二、数据库访问方法。下面结合图3对本实施例的方法进行详细说明。
[0056]图3中,本实施例的方法启动后,一直等待客户端发送来的数据库访问请求,在接收到来自客户端的数据库访问请求后吗,检测该客户端的当前数据库连接信息(如数据库连接的连接标识信息等)是否为空,如果该客户端的当前数据库连接信息不为空,则跳过从连接池中为该客户端选取一条数据库连接的步骤,直接到后续的判断数据库访问请求中的SQL语句是否为加锁的SQL语句的判断步骤;如果该客户端的当前数据库连接信息为空,则从连接池中为该客户端选取一条数据库连接,并存储该选取的数据库连接信息(如存储该数据库连接的连接标识信息等),之后,到后续的判断数据库访问请求中的SQL语句是否为加锁的SQL语句的判断步骤;在判断出该SQL语句为加锁的SQL语句的情况下,将该加锁的SQL语句对应的锁名称添加在该客户端的锁信息记录表中,并将该客户端对应的锁状态标识设置为“锁中”,之后,到执行该SQL语句的步骤;在判断出该SQL语句不是加锁的SQL语句的情况下,应继续后续的判断该SQL语句是否为解锁的SQL语句的步骤,如果判断出不是解锁的SQL语句,则直接到后续的执行该SQL语句的步骤;如果判断出是解锁的SQL语句,则将该解锁的SQL语句对应的锁名称从该客户端对应的锁信息记录表中删除,并在删除该锁信息记录表中最后一个锁名称的情况下,将该客户端的锁状态标识设置为“锁外”,到后续的执行该SQL语句的步骤;在执行该SQL语句后,判断该客户端对应的锁信息记录表是否为空(如判断锁状态标识的取值为“锁中”还是“锁外”),如果该客户端对应的锁信息记录表为空(如锁状态标识的取值为“锁外”),则将该客户端当前具有的该数据库连接回收到连接池中,并继续等待来自客户端的数据库连接请求;如果该客户端对应的锁信息记录表为非空(如锁状态标识的取值为“锁中”),则不执行后续的数据库连接回收步骤,并继续等待来自客户端的数据库连接请求。
[0057]实施例三、数据库访问装置。下面结合图4对本实施例的装置进行详细说明。
[0058]图4中示出的装置主要包括:接收模块400、判断模块410、选取连接模块420、处理模块430、连接回收模块440以及维护模块450。
[0059]接收模块400与判断模块410连接;接收模块400主要适于接收来自客户端的数据库访问请求。
[0060]具体的,接收模块400接收到的数据库访问请求中的SQL语句可以为加锁的SQL语句,也可以为解锁的SQL语句,还可以为不涉及加解锁的SQL语句(下述简称为普通的SQL语句)。这里的SQL语句可以为基于MYSQL的SQL语句,对应的本实施例中的数据库可以为基于MYSQL的数据库。
[0061]判断模块410除了与接收模块400连接之外,还与选取连接模块420以及处理模块430分别连接;判断模块410主要适于判断上述客户端当前是否具有数据库连接,并向选取连接模块420以及处理模块430分别提供其判断结果信息。
[0062]具体的,判断模块410可以根据本地存储的信息来判断该客户端当前是否具有数据库连接,例如,判断模块410判断本地是否存储有与该客户端对应的连接标识信息(如是否存储有客户端标识与数据库连接的连接标识的对应关系信息),如果本地存储有与该客户端对应的连接标识信息(如本地存储有客户端标识与数据库连接的连接标识的对应关系信息),则判断模块410判断出该客户端当前具有数据库连接,判断模块410触发处理模块430执行相应的操作;如果本地未存储有与该客户端对应的连接标识信息(如本地没有存储客户端标识与数据库连接的连接标识的对应关系信息),则判断模块410判断出该客户端当前不具有数据库连接,判断模块410触发选取连接模块420执行相应的操作;再例如,判断模块410判断本地存储的该客户端对应的当前数据库连接标志位的取值,如果该数据库连接标志位的取值为第一预定值(如I或者true等)时,则判断模块410判断出该客户端当前具有数据库连接,判断模块410触发处理模块430执行相应的操作;如果该数据库连接标志位的取值为第二预定值(如O或者false等)时,则判断模块410判断出该客户端当前不具有数据库连接,判断模块410触发选取连接模块420执行相应的操作。
[0063]判断模块410还可以采用其他方式来判断该客户端当前是否具有数据库连接,具体的判断方式不再详细举例说明。
[0064]上述本地存储的信息可以设置于本实施例的上述任一模块中,也可以独立于上述模块而存储在本实施例的装置中。
[0065]选取连接模块420除了与判断模块410连接之外,还与处理模块430连接;选取连接模块420主要适于在上述客户端当前不具有数据库连接的情况下,从连接池中选取数据库连接,并触发处理模块430执行相应的操作,如选取连接模块420通知处理模块430其选取的数据库连接的连接标识,选取连接模块420还可以将客户端标识也一并提供给处理模块 430。
[0066]具体的,在判断模块410确定出该客户端当前不具有数据库连接的情况下,选取连接模块420应从连接池中选取一条数据库连接,并将该选取的数据库连接提供给该客户端;也就是说,选取连接模块420会为当前不具有数据库连接的客户端分配一条已建立好的且存储于连接池中的数据库连接。选取连接模块420可以采用现有的连接分配策略(或者称为数据库连接选取策略)从连接池中为该客户端选取一条数据库连接。
[0067]如果判断模块410根据本地存储的与该客户端对应的连接标识信息来判断该客户端当前是否具有数据库连接,则选取连接模块420从连接池中选取一条数据库连接并提供给该客户端之后,应在本地存储本次选取的数据库连接的连接标识信息,如存储该客户端标识与本次选取的数据库连接的连接标识的对应关系信息。
[0068]如果判断模块410根据本地存储的为该客户端设置的当前数据库连接标志位的取值来判断该客户端当前是否具有数据库连接,则选取连接模块420从连接池中选取一条数据库连接并提供给该客户端之后,应将本地存储的为该客户端设置的当前数据库连接标志位的取值设置为第一预定值,如设置为I或者true等。
[0069]处理模块430除了与选取连接模块420连接之外,还与连接回收模块440连接,处理模块430主要适于基于上述客户端当前具有的数据库连接执行接收模块400接收到的来自上述客户端的数据库访问请求。
[0070]具体的,处理模块430所执行的数据库访问请求可以具体为加锁的SQL语句,也可以为解锁的SQL语句,还可以为普通的SQL语句。
[0071]连接回收模块440主要适于在处理模块430针对上述数据库访问请求执行完成后,根据本地存储的客户端对应的锁信息判断该客户端当前是否具有未释放的锁,如果该客户端当前具有未释放的锁,则连接回收模块440为该客户端保持其当前具有的数据库连接,否则,连接回收模块440将客户端当前具有的数据库连接回收至连接池中。
[0072]具体的,连接回收模块440是根据当前本地已存储的该客户端对应的锁信息来判断该客户端当前是否具有未释放的锁,该锁信息可以为锁名称、锁的数量或者锁状态标识等。上述本地存储的锁信息可以设置于本实施例的上述任一模块中,也可以独立于上述模块而存储在本实施例的装置中。
[0073]—个具体的例子,在每一个客户端分别对应有各自的一个锁信息记录表的情况下,连接回收模块440可以判断已打开的该客户端对应的锁信息记录表中是否包含有锁名称,如果该锁信息记录表中包含有锁名称,则连接回收模块440确定出该客户端当前具有未释放的锁,如果该锁信息记录表中没有包含有锁名称,则连接回收模块440确定出该客户端当前不具有未释放的锁。
[0074]另一个具体的例子,在所有的客户端均对应同一个锁信息记录表的情况下,连接回收模块440可以判断已打开的锁信息记录表中是否包含有该客户端对应的锁名称,如果该锁信息记录表中包含有该客户端对应的锁名称,则连接回收模块440确定出该客户端当前具有未释放的锁,如果该锁信息记录表中没有包含该客户端对应的锁名称,则连接回收模块440确定出该客户端当前不具有未释放的锁。
[0075]第三个具体的例子,在每一个客户端分别对应有各自的锁的数量的情况下,连接回收模块440可以判断该客户端对应的锁的数量的当前值,如果该当前值不为初始值(初始值标识客户端当前不具有未释放的锁),则连接回收模块440确定出客户端当前具有未释放的锁,如果该当前值为初始值,则连接回收模块440确定出该客户端当前不具有未释放的锁。
[0076]第四个具体的例子,在每一个客户端分别对应有各自的锁状态标识的情况下,连接回收模块440可以判断该客户端对应的锁状态标识的取值,如果该客户端对应的锁状态的取值为第一值,则连接回收模块440确定出该客户端当前具有未释放的锁,如果该客户端对应的锁状态的取值为第二值,则连接回收模块440确定出该客户端当前不具有未释放的锁。
[0077]连接回收模块440将数据库连接回收至连接池中的一个具体的例子,连接回收模块440删除本地存储的与该客户端对应的连接标识信息,如连接回收模块440删除本地存储的客户端标识与数据库连接的连接标识的对应关系信息。
[0078]维护模块450主要适于在数据库访问请求中的SQL语句为加锁的SQL语句的情况下,存储加锁的SQL语句的执行而使客户端获得的锁的锁名称;在数据库访问请求中的SQL语句为解锁的SQL语句的情况下,从存储的锁名称中删除解锁的SQL语句的执行而使客户端释放的锁的锁名称。
[0079]在处理模块430本次执行的SQL语句为加锁的SQL语句的情况下,通常在该SQL语句执行前/后,客户端会获得相应的锁。在客户端获得锁时,维护模块450应维护该客户端对应的锁信息,例如,维护模块450在本地存储该锁的锁名称,再如,维护模块450增加本地存储的该客户端当前拥有的锁的数量等;在本地存储锁名称的情况下,维护模块450可以将客户端当前获得的锁名称添加在该客户端对应的锁名称集合中;在增加该客户端当前拥有的锁的数量的情况下,维护模块450可以将该客户端当前拥有的锁的数量加I。
[0080]另外,在本实施例中的客户端还对应有锁状态标识的情况下,在将客户端当前获得的锁名称添加在该客户端对应的锁名称集合中时,维护模块450应对应设置该客户端对应的锁状态标识的取值。
[0081]在处理模块430本次执行的SQL语句为解锁的SQL语句的情况下,通常在该SQL语句执行前/后,客户端会释放相应的锁,例如,客户端请求执行SELECT RELEASE,LOCK ( ‘ lockl ’ )的SQL语句,该SQL语句在被处理模块430执行后,客户端释放其当前拥有的锁lockl。
[0082]在本实施例中,在客户端释放其当前拥有的一个锁或多个锁时,维护模块450同样应维护该客户端对应的锁信息;如删除本地已存储的该锁的锁名称,再如,减小本地存储的该客户端当前拥有的锁的数量等;在删除锁名称的情况下,维护模块450可以从该客户端对应的锁名称集合中删除该客户端当前释放的锁的锁名称;在减小该客户端当前拥有的锁的数量的情况下,维护模块450可以将该客户端当前拥有的锁的数量减I。另外,在本实施例中的客户端还对应有锁状态标识的情况下,在将客户端当前释放的锁的锁名称从该客户端对应的锁名称集合中删除时,维护模块450应对应设置该客户端对应的锁状态标识的取值,如在该客户端对应的锁名称集合中没有任何锁名称时,维护模块450将锁状态标识设置为表示该客户端目前处于锁外状态的取值,再如,在该客户端对应的锁名称集合中还存在至少一个锁名称时,维护模块450将锁状态标识设置为表示该客户端处于锁中状态的取值。
[0083]在处理模块本次执行的SQL语句为普通的SQL语句的情况下,在该SQL语句执行前/后,维护模块450应不会针对该SQL语句执行与该客户端对应的锁信息的相关维护操作。
[0084]本实施例中的锁名称集合可以具体表现为锁信息记录表的形式;锁信息记录表的具体例子以及针对该锁信息记录表所执行的维护操作的具体过程如上述方法实施例中的描述,在此不再重复说明。
[0085]需要特别说明的是,维护模块450维护该客户端对应的锁信息的具体过程可以在处理模块430执行数据库访问请求之前执行,也可以在处理模块430执行数据库访问请求之后执行,当然,本实施例也不排除维护模块4450维护锁信息过程与处理模块430执行数据库访问请求并行执行的可能性。
[0086]Al、一种数据库访问方法,其包括:
[0087]接收来自客户端的数据库访问请求;
[0088]判断所述客户端当前是否具有数据库连接;
[0089]在所述客户端当前不具有数据库连接的情况下,从连接池中选取数据库连接,并提供给所述客户端;
[0090]基于所述客户端当前具有的数据库连接执行所述数据库访问请求;[0091]在所述数据库访问请求执行完成后,根据存储的所述客户端对应的锁信息判断所述客户端当前是否具有未释放的锁;
[0092]如果所述客户端当前具有未释放的锁,则为所述客户端保持所述数据库连接,否则,将所述数据库连接回收至所述连接池中。
[0093]A2、如Al所述的方法,其中,所述判断所述客户端当前是否具有数据库连接包括:
[0094]判断是否记录有与所述客户端对应的连接标识信息;
[0095]如果记录有与所述客户端对应的连接标识信息,则所述客户端当前具有数据库连接,否则,所述客户端当前不具有数据库连接。
[0096]A3、如A2所述的方法,其中,在从连接池中选取数据库连接,并提供给所述客户端后,所述方法还包括:
[0097]记录客户端标识与所述选取的数据库连接的连接标识信息的对应关系。
[0098]A4、如Al或A2或A3所述的方法,其中,所述锁信息包括:锁名称或者锁的数量或者锁状态标识。
[0099]A5、如A4所述的方法,其中,所述方法还包括:
[0100]在所述数据库访问请求中的SQL语句为加锁的SQL语句的情况下,存储所述加锁的SQL语句的执行而使所述客户端获得的锁的锁名称;
[0101]在所述数据库访问请求中的SQL语句为解锁的SQL语句的情况下,从存储的锁名称中删除所述解锁的SQL语句的执行而使所述客户端释放的锁的锁名称。
[0102]A6、如A5所述的方法,其中,每一客户端分别对应有各自的锁信息记录表,且所述锁名称存储于发送所述数据库访问请求的客户端所对应的锁信息记录表中。
[0103]A7、如A6所述的方法,其中,每一锁信息记录表分别对应有各自的锁状态标识,且所述锁状态标识表示锁信息记录表为空或者非空。
[0104]A8、如A7所述的方法,其中,所述方法还包括:
[0105]在向锁信息记录表中增加锁名称后,将该锁信息记录表对应的锁状态标识设置为非空;
[0106]在从锁信息记录表中删除锁名称后,判断该锁信息记录表是否为空时;
[0107]如果该锁信息记录表为空,则将该锁信息记录表对应的锁状态标识设置为空,否贝U,将该锁信息记录表对应的锁状态标识设置为非空。
[0108]A9、如A7所述的方法,其中,所述根据存储的所述客户端对应的锁信息判断所述客户端当前是否具有未释放的锁包括:
[0109]获取所述客户端对应的锁状态标识,在判断出所述锁状态标识表示锁信息记录表为空时,确定所述客户端当前不具有未释放的锁,否则,确定所述客户端具有未释放的锁。
[0110]B10、一种数据库访问装置,其包括:
[0111]接收模块,适于接收来自客户端的数据库访问请求;
[0112]判断模块,适于判断所述客户端当前是否具有数据库连接;
[0113]选取连接模块,适于在所述客户端当前不具有数据库连接的情况下,从连接池中选取数据库连接,并提供给所述客户端;
[0114]处理模块,适于基于所述客户端当前具有的数据库连接执行所述数据库访问请求;[0115]连接回收模块,适于在所述数据库访问请求执行完成后,根据存储的所述客户端对应的锁信息判断所述客户端当前是否具有未释放的锁,如果所述客户端当前具有未释放的锁,则为所述客户端保持所述数据库连接,否则,将所述数据库连接回收至所述连接池中。
[0116]B11、如BlO所述的装置,其中,所述判断模块还适于:
[0117]判断是否记录有与所述客户端对应的连接标识信息;
[0118]如果记录有与所述客户端对应的连接标识信息,则所述客户端当前具有数据库连接,否则,所述客户端当前不具有数据库连接。
[0119]B12、如Bll所述的装置,其中,所述选取连接模块还适于:
[0120]在从连接池中选取数据库连接,并提供给所述客户端后,记录客户端标识与所述选取的数据库连接的连接标识信息的对应关系。
[0121]B13、如BlO或Bll或B12所述的装置,其中,所述锁信息包括:锁名称或者锁的数量或者锁状态标识。
[0122]B14、如B13所述的装置,其中,所装置还包括:
[0123]维护模块,适于在所述数据库访问请求中的SQL语句为加锁的SQL语句的情况下,存储所述加锁的SQL语句的执行而使所述客户端获得的锁的锁名称;在所述数据库访问请求中的SQL语句为解锁的SQL语句的情况下,从存储的锁名称中删除所述解锁的SQL语句的执行而使所述客户端释放的锁的锁名称。
[0124]B15、如B14所述的装置,其中,每一客户端分别对应有各自的锁信息记录表,且所述处理模块将锁名称存储于发送所述数据库访问请求的客户端所对应的锁信息记录表中。
[0125]B16、如B15所述的装置,其中,每一锁信息记录表分别对应有各自的锁状态标识,且所述锁状态标识表示锁信息记录表为空或者非空。
[0126]B17、如B16所述的装置,其中,所述处理模块还适于:
[0127]在向锁信息记录表中增加锁名称后,将该锁信息记录表对应的锁状态标识设置为非空;
[0128]在从锁信息记录表中删除锁名称后,判断该锁信息记录表是否为空时;
[0129]如果该锁信息记录表为空,则将该锁信息记录表对应的锁状态标识设置为空,否贝U,将该锁信息记录表对应的锁状态标识设置为非空。
[0130]B18、如B16所述的装置,其中,所述连接回收模块还适于:
[0131]获取所述客户端对应的锁状态标识,在判断出所述锁状态标识表示锁信息记录表为空时,确定所述客户端当前不具有未释放的锁,否则,确定所述客户端具有未释放的锁。
[0132]在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
[0133]在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。[0134]类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循【具体实施方式】的权利要求书由此明确地并入该【具体实施方式】,其中每个权利要求本身都作为本发明的单独实施例。
[0135]本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0136]此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0137]本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP )来实现根据本发明实施例的数据库访问装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
[0138]应该注意的是,上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
【权利要求】
1.一种数据库访问方法,其包括: 接收来自客户端的数据库访问请求; 判断所述客户端当前是否具有数据库连接; 在所述客户端当前不具有数据库连接的情况下,从连接池中选取数据库连接,并提供给所述客户端; 基于所述客户端当前具有的数据库连接执行所述数据库访问请求; 在所述数据库访问请求执行完成后,根据存储的所述客户端对应的锁信息判断所述客户端当前是否具有未释放的锁; 如果所述客户端当前具有未释放的锁,则为所述客户端保持所述数据库连接,否则,将所述数据库连接回收至所述连接池中。
2.如权利要求1所述的方法,其中,所述判断所述客户端当前是否具有数据库连接包括: 判断是否记录有与所述客户端对应的连接标识信息; 如果记录有与所述客户端对应的连接标识信息,则所述客户端当前具有数据库连接,否则,所述客户端当前不具有数据库连接。
3.如权利要求2所述的方法,其中,在从连接池中选取数据库连接,并提供给所述客户端后,所述方法还包括: 记录客户端标识与所述选取的数据库连接的连接标识信息的对应关系。
4.如权利要求1或2或3所述的方法,其中,所述锁信息包括:锁名称或者锁的数量或者锁状态标识。
5.如权利要求4所述的方法,其中,所述方法还包括: 在所述数据库访问请求中的SQL语句为加锁的SQL语句的情况下,存储所述加锁的SQL语句的执行而使所述客户端获得的锁的锁名称; 在所述数据库访问请求中的SQL语句为解锁的SQL语句的情况下,从存储的锁名称中删除所述解锁的SQL语句的执行而使所述客户端释放的锁的锁名称。
6.如权利要求5所述的方法,其中,每一客户端分别对应有各自的锁信息记录表,且所述锁名称存储于发送所述数据库访问请求的客户端所对应的锁信息记录表中。
7.如权利要求6所述的方法,其中,每一锁信息记录表分别对应有各自的锁状态标识,且所述锁状态标识表示锁信息记录表为空或者非空。
8.如权利要求7所述的方法,其中,所述方法还包括: 在向锁信息记录表中增加锁名称后,将该锁信息记录表对应的锁状态标识设置为非空; 在从锁信息记录表中删除锁名称后,判断该锁信息记录表是否为空时; 如果该锁信息记录表为空,则将该锁信息记录表对应的锁状态标识设置为空,否则,将该锁信息记录表对应的锁状态标识设置为非空。
9.如权利要求7所述的方法,其中,所述根据存储的所述客户端对应的锁信息判断所述客户端当前是否具有未释放的锁包括: 获取所述客户端对应的锁状态标识,在判断出所述锁状态标识表示锁信息记录表为空时,确定所述客户端当前不具有未释放的锁,否则,确定所述客户端具有未释放的锁。
10.一种数据库访问装置,其包括: 接收模块,适于接收来自客户端的数据库访问请求; 判断模块,适于判断所述客户端当前是否具有数据库连接; 选取连接模块,适于在所述客户端当前不具有数据库连接的情况下,从连接池中选取数据库连接,并提供给所述客户端;处理模块,适于基于所述客户端当前具有的数据库连接执行所述数据库访问请求;连接回收模块,适于在所述数据库访问请求执行完成后,根据存储的所述客户端对应的锁信息判断所述客户端当前是否具有未释放的锁,如果所述客户端当前具有未释放的锁,则为所述客户端保持 所述数据库连接,否则,将所述数据库连接回收至所述连接池中。
【文档编号】G06F17/30GK103761240SQ201310681688
【公开日】2014年4月30日 申请日期:2013年12月12日 优先权日:2013年12月12日
【发明者】朱超, 王超, 陈飞 申请人:北京奇虎科技有限公司, 奇智软件(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1