用于数据库连接池的资源分配方法和装置
技术领域
本申请涉及数据库领域,具体而言,涉及一种用于数据库连接池的资源分配方法和装置。
背景技术
在分布式环境下,应用系统需要对外提供多种服务,这些服务大多需要访问数据库。在相关技术中,为了使应用系统能够快速访问数据库中的数据,通常采用数据库连接池机制来实现应用系统和数据库之间的连接:当应用系统需要与数据库通信时,需要先检查数据库连接池中是否有可用的数据库连接(即,空闲数据库连接);如果该数据库连接池中有可用的数据库连接,则直接使用可用的数据库连接来实现上述通信;如果该数据库连接池中没有可用的数据库连接,则需要实时创建新的数据库连接,并使用新创建的数据库连接来实现上述通信。
虽然上述数据库连接池机制避免了建立大量数据库连接所花费的时间代价,提升了应用系统的性能,但是该机制缺乏对sql(Structured Query Language,结构化查询语言)运行状况的监控管理。这样,每当应用系统需要访问数据库时,数据库都会直接给予连接,导致某些由于运维故障或者数据不断积累等原因而运行越来越慢的sql在获得连接后,难以释放连接,从进而导致数据库连接池中的资源耗尽,使得其他需要访问数据库的应用系统无法正常对外提供服务。
针对相关技术中数据库连接池机制在执行数据库连接分配时,容易导致数据库连接池中的资源耗尽的问题,目前尚未提出有效的解决方案。
申请内容
本申请的主要目的在于提供一种用于数据库连接池的资源分配方法和装置,以解决相关技术中数据库连接池机制在执行数据库连接分配时,容易导致数据库连接池中的资源耗尽的问题。
为了实现上述目的,根据本申请的一个方面,提供了一种用于数据库连接池的资源分配方法,该方法包括:接收客户端发送的数据库访问请求;以及根据所述数据库访问请求的历史执行结果判断是否允许将数据库连接池中空闲的数据库连接分配给所述客户端。
进一步地,根据所述数据库访问请求的历史执行结果判断是否允许将数据库连接池中空闲的数据库连接分配给所述客户端包括:从所述历史执行结果中获取已执行的所述数据库访问请求的执行结果属性;以及根据所述执行结果属性判断是否允许将数据库连接池中空闲的数据库连接分配给所述客户端。
进一步地,所述执行结果属性包括:执行时间,根据所述执行结果属性判断是否允许将数据库连接池中空闲的数据库连接分配给所述客户端包括:从已执行的所述数据库访问请求中获取执行时间超过第一预定时间阈值的数据库访问请求的第一个数;以及若所述第一个数小于第一数量阈值,则判断出允许将所述数据库连接池中空闲的数据库连接分配给所述客户端。
进一步地,所述执行结果属性包括:出错率,根据所述执行结果属性判断是否允许将数据库连接池中空闲的数据库连接分配给所述客户端包括:从已执行的所述数据库访问请求中获取出现执行错误的数据库访问请求的第一比例;以及若所述第一比例小于第一比例阈值,则判断出允许将所述数据库连接池中空闲的数据库连接分配给所述客户端。
进一步地,所述执行结果属性包括:执行时间和出错率,根据所述执行结果属性判断是否允许将数据库连接池中空闲的数据库连接分配给所述客户端包括:从已执行的所述数据库访问请求中获取执行时间超过第一预定时间阈值的数据库访问请求的第一个数、且从已执行的所述数据库访问请求中获取出现执行错误的数据库访问请求的第一比例;以及若所述第一个数小于第一数量阈值、且所述第一比例小于第一比例阈值,则判断出允许将所述数据库连接池中空闲的数据库连接分配给所述客户端。
进一步地,在判断出允许将所述数据库连接池中空闲的数据库连接分配给所述客户端之后,所述资源分配方法还包括:创建数据库访问请求白名单;以及将允许将所述数据库连接池中空闲的数据库连接分配给所述客户端的数据库访问请求存储至所述数据库访问请求白名单中。
进一步地,所述执行结果属性包括:执行时间,根据所述执行结果属性判断是否允许将数据库连接池中空闲的数据库连接分配给所述客户端包括:从已执行的所述数据库访问请求中获取执行时间超过第二预定时间阈值的数据库访问请求的第二个数;判断已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求的执行结果是否满足预定条件;以及若所述第二个数小于第二数量阈值、且所述执行结果满足所述预定条件,则判断出允许将所述数据库连接池中空闲的数据库连接分配给所述客户端。
进一步地,判断已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求的执行结果是否满足预定条件包括:从已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求中获取执行时间超过第三预定时间阈值的数据库访问请求的第三个数;若所述第三个数小于第三数量阈值,则判断出所述已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求的执行结果满足所述预定条件。
进一步地,所述执行结果属性包括:出错率,根据所述执行结果属性判断是否允许将数据库连接池中空闲的数据库连接分配给所述客户端包括:从已执行的所述数据库访问请求中获取出现执行错误的数据库访问请求的第二比例;判断已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求的执行结果是否满足预定条件;以及若所述第二比例小于第二比例阈值、且所述执行结果满足所述预定条件,则判断出允许将所述数据库连接池中空闲的数据库连接分配给所述客户端。
进一步地,判断已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求的执行结果是否满足预定条件包括:从已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求中获取出现执行错误的数据库访问请求的第三比例;以及若所述第三比例小于第三比例阈值,则判断出所述已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求的执行结果满足所述预定条件。
进一步地,所述执行结果属性包括:执行时间和出错率,根据所述执行结果属性判断是否允许将数据库连接池中空闲的数据库连接分配给所述客户端包括:从已执行的所述数据库访问请求中获取执行时间超过第二预定时间阈值的数据库访问请求的第二个数;从已执行的所述数据库访问请求中获取出现执行错误的数据库访问请求的第二比例;判断已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求的执行结果是否满足预定条件;以及若所述第二个数小于第二数量阈值、且所述比例小于第二比例阈值以及所述执行结果满足所述预定条件,则判断出允许将数据库连接池中空闲的数据库连接分配给所述客户端。
进一步地,判断已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求的执行结果是否满足预定条件包括:从已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求中获取执行时间超过第三预定时间阈值的数据库访问请求的第三个数;从已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求中获取出现执行错误的数据库访问请求的第三比例;以及若所述第三个数小于第三数量阈值、且所述第三比例小于第三比例阈值,则判断出所述已执行的所述数据库访问请求中由所述客户端发送的所述数据库访问请求的执行结果满足所述预定条件。
进一步地,在判断出允许将所述数据库连接池中空闲的数据库连接分配给所述客户端之后,所述资源分配方法还包括:创建客户端白名单;以及将被允许分配所述数据库连接池中空闲的数据库连接的客户端存储至客户端白名单中。
为了实现上述目的,根据本申请的另一方面,提供了一种用于数据库连接池的资源分配装置,该装置包括:接收单元,用于接收客户端发送的数据库访问请求;以及判断单元,用于根据所述数据库访问请求的历史执行结果判断是否允许将数据库连接池中空闲的数据库连接分配给所述客户端。
进一步地,所述判断单元包括:获取模块,用于从所述历史执行结果中获取已执行的所述数据库访问请求的执行结果属性;以及判断模块,用于根据所述执行结果属性判断是否允许将数据库连接池中空闲的数据库连接分配给所述客户端。
通过本申请,采用接收客户端发送的数据库访问请求;根据数据库访问请求的历史执行结果判断是否允许将数据库连接池中空闲的数据库连接分配给客户端,由于可以通过历史执行结果对数据库访问请求进行筛选,仅仅将空闲的数据库连接分配给历史表现良好的数据库访问请求,而不对历史表现差的数据库访问请求分配数据库连接,因此可以防止历史表现差的数据库访问请求占用数据库连接,节约数据库连接资源,达到了防止数据库连接池中的资源耗尽的效果。
附图说明
构成本申请的一部分的附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1是根据本申请实施例的用于数据库连接池的资源分配方法的流程图;
图2是根据本申请实施例的动态分配数据库连接池中的资源的系统架构图;以及
图3是根据本申请实施例的用于数据库连接池的资源分配装置的示意图。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
为了使本领域的技术人员更好的理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,在本领域普通技术人员没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请的保护范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含。
根据本申请的实施例,提供了一种用于数据库连接池的资源分配方法,该用于数据库连接池的资源分配方法可以运行在计算机处理设备上。需要说明的是,在本申请实施例中,附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
在详细阐述本申请之前,先对本申请中引用的以下名词进行解释:
数据库:用来永久或监时存放业务数据、系统数据的软件系统及其数据,包括但不仅限于Oracle、MySQL、SQL Server、Tair、OceanBase等软件系统。
数据库连接:应用程序(即客户端)和数据库交互时,需要根据一定的通信协议建立一个通道,这个通道称之为数据库连接。
数据库连接池:当应用程序(即客户端)请求和数据库建立数据库连接时,在数据库服务器端实时建立上述连接即消耗时间,又消耗数据库服务器中的资源。为了使得应用程序(即客户端)快速访问数据库中的数据,在应用程序(即客户端)上,设置一个队列结构来预先建立一定数量的数据库连接,当这些数据库连接空闲时,其连接信息会出现在上述的队列结构中。当应用程序(即客户端)请求和数据库通信时,就可以检测该队列结构中是否存在空闲的数据库连接,如果存在,则直接获取并使用之,如果不存在,则实时创建新的数据库连接,并将新创建的数据库连接存储在该数据库连接池中。上述数据库连接池机制有效地避免了实时创建大量数据库连接的所耗费的时间代价和资源代价,提升了应用性能,提高了数据库端的资源利用率。
图1是根据本申请实施例的用于数据库连接池的资源分配方法的流程图。如图1所示,该方法包括如下的步骤S102至步骤S104:
步骤S102,接收客户端发送的数据库访问请求。
客户端即为前述的应用程序。客户端需要与数据库交互时,客户端可以向数据库发送数据库访问请求,在数据库进行相应之前,数据层中的连接分配决策层可以首先拦截客户端发送的数据库访问请求,也即,连接分配决策层接收客户端发送的数据库访问请求,连接分配决策层用于接收到的根据数据库访问请求决定是否将数据库连接分配给该客户端。数据库访问请求包括查询、更改、添加、删除数据库中的数据的请求。
步骤S104,根据数据库访问请求的历史执行结果判断是否允许将数据库连接池中空闲的数据库连接分配给客户端。
数据库访问请求的历史执行结果是指该条数据库访问请求在本次请求之前的一段时间内被执行时记录的结果,其中,包括该数据库访问请求是否被成功执行,以及在该数据库访问请求被成功执行时,该历史执行结果还包括数据库访问请求的执行时间和/或出错率。
具体地,可以对数据库访问请求进行解析,得到解析结果,并根据解析结果查询数据列表中存储的数据库访问请求的历史执行结果,从而判断是否允许将数据库连接池中空闲的数据库连接分配给客户端。空闲的数据库连接即为可用的数据库连接。
其中,如果判断出允许将数据库连接池中空闲的数据库连接分配给客户端,则将数据库连接池中的空闲的数据库连接分配给客户端。如果判断出不允许将数据库连接池中空闲的数据库连接分配给客户端,则不将数据库连接池中的空闲的数据库连接分配给客户端。
具体地,当前述的历史结果表明该数据库访问请求在历史上表现良好,则将数据库连接池中的空闲的数据库连接分配给客户端,否则,不将数据库连接池中的空闲的数据库连接分配给客户端。
通过本申请实施例,采用接收客户端发送的数据库访问请求;根据数据库访问请求的历史执行结果判断是否允许将数据库连接池中空闲的数据库连接分配给客户端;如果判断出允许将数据库连接池中空闲的数据库连接分配给客户端,则将数据库连接池中的空闲的数据库连接分配给客户端,由于可以通过历史执行结果对数据库访问请求进行筛选,仅仅将空闲的数据库连接分配给历史表现良好的数据库访问请求,而不对历史表现差的数据库访问请求分配数据库连接,因此可以防止历史表现差的数据库访问请求占用数据库连接,节约数据库连接资源,达到了防止数据库连接池中的资源耗尽的效果。
优选地,在本申请实施例中,步骤S104根据数据库访问请求的历史执行结果判断是否允许将数据库连接池中空闲的数据库连接分配给客户端可以包括:
S2,从历史执行结果中获取已执行的数据库访问请求的执行结果属性。
具体地,可以获取一段时间内已执行的数据库访问请求的执行结果属性,其中,执行结果属性与数据库访问请求一一对应。其中,执行结果属性包括:执行时间和/或出错率。执行时间包括执行时间的起始点和执行时间的时长。出错率是指在一段时间内,同一数据库访问请求在执行时出错的次数和被执行的总次数的比值。
S4,根据执行结果属性判断是否允许将数据库连接池中空闲的数据库连接分配给客户端。
具体地,可以将执行结果属性进行分类存储,如果执行结果属性满足分配条件,则将其存储在第一列表(如,数据库访问请求白名单)中;如果执行结果属性不满足分配条件,则将其存储在第二列表(如,数据库访问请求黑名单)中。其中,如果判断出执行结果存储在第一列表中,则允许将数据库连接池中空闲的数据库连接分配给客户端;如果判断出执行结果存储在第二列表中,则不允许将数据库连接池中空闲的数据库连接分配给客户端。
通过本申请实施例,采用执行结果属性(即,执行时间和/或出错率)来判断是否允许将数据库连接池中空闲的数据库连接分配给客户端,由于执行时间和/或出错率易于记录和检测,并且可以进行量化,因此可以精确的判断出是否允许将数据库连接池中空闲的数据库连接分配给客户端,达到了在防止数据库连接池中的资源耗尽的同时,使得数据库连接的分配更准确的效果。
例如,数据库访问请求包括sql请求,由于系统中某些sql索引出现问题,这样,每次执行该sql请求都会超时,这些sql请求一直占有数据库连接直至超时才会释放,导致数据库连接池中的资源被迅速占用,甚至瘫痪。通过本申请实施例,根据sql请求的历史执行结果,不再给某些在一段时间内常出现超时的sql请求分配数据库连接,以防止数据库连接池资源耗尽。
优选地,在本申请实施例中,由于执行结果属性可以包括一个或者多个,因此,在根据执行结果属性判断是否允许将数据库连接池中空闲的数据库连接分配给客户端时,可以通过以下任一方式实现:
方式11,当执行结果属性包括执行时间时,从已执行的数据库访问请求中获取执行时间超过第一预定时间阈值的数据库访问请求的第一个数,若第一个数小于第一数量阈值,则判断出允许将数据库连接池中空闲的数据库连接分配给客户端。若第一个数大于等于第一数量阈值,则判断出不允许将数据库连接池中空闲的数据库连接分配给客户端。其中,若第一个数大于等于第一数量阈值,则其对应的执行时间可以存储在时间黑名单中。
方式12,当执行结果属性包括出错率时,从已执行的数据库访问请求中获取出现执行错误的数据库访问请求的第一比例,若第一比例小于第一比例阈值,则判断出允许将数据库连接池中空闲的数据库连接分配给客户端。若第一比例大于等于第一比例阈值,则判断出不允许将数据库连接池中空闲的数据库连接分配给客户端。若第一比例大于等于第一比例阈值,则其对应的出错率可以存储在出错率黑名单中。
方式13,当执行结果属性包括执行时间和出错率时,从已执行的数据库访问请求中获取执行时间超过第一预定时间阈值的数据库访问请求的第一个数、且从已执行的数据库访问请求中获取出现执行错误的数据库访问请求的第一比例,若第一个数小于第一数量阈值、且第一比例小于第一比例阈值,则判断出允许将数据库连接池中空闲的数据库连接分配给客户端。若第一个数大于等于第一数量阈值、和/或第一比例大于等于第一比例阈值,则判断出不允许将数据库连接池中空闲的数据库连接分配给客户端。
通过本申请实施例,采用预定时间阈值和/或比例阈值,由于可以将记录的执行时间与预定的时间阈值进行比较,和/或将记录的出错率与预定的比例阈值进行比较,从而可以得到更加准确的比较结果,因此量化跟准确,达到了在防止数据库连接池中的资源耗尽的同时,准确量化是否进行数据库连接分配的效果。
优选地,在本申请实施例中,在判断出允许将数据库连接池中空闲的数据库连接分配给客户端之后,资源分配方法还包括:
S6,创建数据库访问请求白名单。
S8,将允许将数据库连接池中空闲的数据库连接分配给客户端的数据库访问请求存储至数据库访问请求白名单中。
需要说明的是,在创建数据库访问请求白名单的同时,还可以创建数据库访问请求黑名单,其中,将不允许将数据库连接池中空闲的数据库连接分配给客户端的数据库访问请求存储至数据库访问请求黑名单中。
以数据库访问请求黑名单为例,该数据库访问请求黑名单可以以数据库表的方式直接存储在数据库中。具体地,在数据库访问请求黑名单中,可以存储数据库访问请求的模板、发生时间、执行时间、报错时间。例如,当存储数据库访问请求为Sql请求时,在数据库访问请求黑名单中可以存储形式如select*from ebpp_bill_info t where t.biz_type=#BizType#and card_no=#CardNo#的Sql请求的模板。发生时间是指数据库访问请求被发起的时间;执行时间是指执行数据库访问请求所消耗的时间;报错时间是指在执行数据库访问请求过程中如果出现错误,则错误上报的时间。优选地,在数据库访问请求黑名单中,还可以存储发起该数据库访问请求的用户的标识或者客户端的标识。
同理,数据库访问请求白名单中也可以存储上述内容,详细内容同上,再次不再赘述。不同的是,在数据库访问请求白名单和数据库访问请求黑名单中,针对同一存储内容存储的参数值不同。
需要说明的是,上述的数据库访问请求白名单和数据库访问请求黑名单中的存储内容可以用于量化各条数据库访问请求的历史执行结果。
优选地,在本申请实施例中,由于历史上使用同一数据库访问请求的客户端可以包括一个或者多个,因此,当使用同一数据库访问请求的客户端包括多个时,在根据执行结果属性判断是否允许将数据库连接池中空闲的数据库连接分配给客户端时,可以通过以下任一方式实现:
方式21,当执行结果属性包括执行时间时,从已执行的数据库访问请求中获取执行时间超过第二预定时间阈值的数据库访问请求的第二个数,并判断已执行的数据库访问请求中由前述的客户端发送的数据库访问请求的执行结果是否满足预定条件;若第二个数小于第二数量阈值、且执行结果满足预定条件,则判断出允许将数据库连接池中空闲的数据库连接分配给客户端。否则,判断出不允许将数据库连接池中空闲的数据库连接分配给客户端。
方式22,当执行结果属性包括出错率时,从已执行的数据库访问请求中获取出现执行错误的数据库访问请求的第二比例,并判断已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果是否满足预定条件;若第二比例小于第二比例阈值、且执行结果满足预定条件,则判断出允许将数据库连接池中空闲的数据库连接分配给客户端。否则,判断出不允许将数据库连接池中空闲的数据库连接分配给客户端。
方式23,当执行结果属性包括执行时间和出错率时,从已执行的数据库访问请求中获取执行时间超过第二预定时间阈值的数据库访问请求的个数、且从已执行的数据库访问请求中获取出现执行错误的数据库访问请求的第二比例、并判断已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果是否满足预定条件;若第二个数小于第二数量阈值、且比例小于第二比例阈值以及执行结果满足预定条件,则判断出允许将数据库连接池中空闲的数据库连接分配给客户端。
其中,第二预定时间阈值可以与前述的第一预定时间阈值相同。第二数量阈值可以与前述的第一数量阈值相同。第二比例阈值可以与前述的第一比例阈值形同。
通过本申请实施例,采用客户端的历史表现对数据库访问请求进行筛选,由于有些客户端使用某一数据库访问请求时的执行时间和/或出错率可能满足允许将数据库连接池中空闲的数据库连接分配给该客户端的条件,而另一些客户端在使用同一数据库访问请求时的执行时间和/或出错率可能不满足允许将数据库连接池中空闲的数据库连接分配给该客户端的条件,因此可以通过客户端的标识信息进行过滤,防止个别恶意客户端频繁执行耗时较长sql请求,导致整个数据库相应缓慢,达到了的通过客户端确定是否允许将数据库连接池中空闲的数据库连接分配给该客户端的效果。
优选地,在本申请实施例中,由于客户端在执行数据库访问请求时,也可以记录执行时间和/或出错率属性,因此在判断已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果是否满足预定条件时,可以通过以下任一方式实现:
方式31,从已执行的数据库访问请求中由客户端发送的数据库访问请求中获取执行时间超过第三预定时间阈值的数据库访问请求的第三个数,若第三个数小于第三数量阈值,则判断出已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果满足预定条件。否则,判断出已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果不满足预定条件。
方式32,从已执行的数据库访问请求中由客户端发送的数据库访问请求中获取出现执行错误的数据库访问请求的第三比例,若第三比例小于第三比例阈值,则判断出已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果满足预定条件。否则,判断出已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果不满足预定条件。
方式33,从已执行的数据库访问请求中由客户端发送的数据库访问请求中获取执行时间超过第三预定时间阈值的数据库访问请求的第三个数、且从已执行的数据库访问请求中由客户端发送的数据库访问请求中获取出现执行错误的数据库访问请求的第三比例,若第三个数小于第三数量阈值、且第三比例小于第三比例阈值,则判断出已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果满足预定条件。否则,判断出已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果满足预定条件。
通过本申请实施例,采用执行时间和/或出错率属性来判断客户端发送的数据库访问请求的执行结果满足预定条件,由于与判断数据库访问请求的判断逻辑类似,因此达到了整个数据库连接资源分配的判断逻辑一致且简单的效果。
需要说明的是,在本申请的前述实施例中,在将数据库连接池中的空闲的数据库连接分配给客户端之后,客户端执行前述的数据库访问请求并将执行结果属性存储在数据库列表中。这样,可以为下次是否给发送该数据库访问请求的客户端分配数据库连接提供分配依据。
另外,在本申请的前述实施例中,除了通过上述实施例所述的手段来判断是否允许给客户端分配数据库连接之外,还可以通过数据库访问请求所对应的业务优先级和/或数据库访问请求本身的查询条件(如,查询条件的限定值)来判断。这样,可以防止某些优先级较低的业务的sql请求出现问题,导致全部业务都受到影响。
具体地,当数据库连接池中的资源数低于一定阀值时,给业务优先级高的业务分配数据库连接。例如:对于支付宝账单缴费类业务而言:业务流水创建支付销账等的优先级远高于欠费单的落地等辅助功能,如果数据库连接池资源紧张时,前者的资源获取优先级更高。而对于查询条件而言,如果某些sql查询条件的限定值区分能力差,并且执行时耗时长,返回结果多,则执行数据库连接分配处理。
优选地,可以综合数据库访问请求的历史执行结果、客户端的历史表现结果、请求所对应的业务优先级以及请求本身的查询条件的限定值四个因素来判断是否允许给客户端分配数据库连接。
优选地,在本申请实施例中,在判断出允许将数据库连接池中空闲的数据库连接分配给客户端之后,资源分配方法还包括:
S10,创建客户端白名单。
S12,将被允许分配数据库连接池中空闲的数据库连接的客户端存储至客户端白名单中。
需要说明的是,在创建客户端白名单的同时,可以创建客户端黑名单,其中,将被允许分配数据库连接池中空闲的数据库连接的客户端之外的客户端存储至客户端黑名单中。
以客户端黑名单为例,该客户端黑名单可以以数据库表的方式直接存储在数据库中。具体地,在客户端黑名单中,可以存储数据库访问请求的模板、发生时间、执行时间、报错时间和客户端标识。例如,当存储数据库访问请求为Sql请求时,在客户端黑名单中可以存储形式如select*from ebpp_bill_info t where t.biz_type=#BizType#and card_no=#CardNo#的Sql请求的模板。发生时间是指数据库访问请求被发起的时间;执行时间是指执行数据库访问请求所消耗的时间;报错时间是指在执行数据库访问请求过程中如果出现错误,则错误上报的时间。需要说明的是,客户端标识可以为用户标识,例如,其可以是该用户的支付宝账号。
同理,客户端白名单中也可以存储上述内容,详细内容同上,再次不再赘述。不同的是,在客户端白名单和客户端黑名单中,针对同一存储内容存储的参数值不同。
需要说明的是,上述的客户端白名单和客户端黑名单中的存储内容可以用于量化各个客户端的历史执行结果。
以下以数据库访问请求为Sql请求为例,详细阐述本申请。
如图2所示,该动态分配数据库连接池中的资源的系统架构包括:业务层、应用层和数据层。其中,客户端为应用层,数据库为数据层。数据层用于接收应用层发送的Sql请求,并根据Sql请求判断是否允许将数据库连接池中空闲的数据库连接分配给客户端。
具体地,如图2所示,数据层中的连接分配决策层首先拦截Sql请求,连接分配决策层中的连接分配决策模块根据Sql请求查询数据库并获取Sql的历史执行结果(包括Sql的历史表现和使用Sql的客户端的历史表现)、业务优先级、各表字段的区分度(即,Sql的限定值)3个决策因素,并通过综合这3个决策因素判断出是否允许将数据库连接池中空闲的数据库连接分配给应用层。
优选地,连接分配决策模块可以获取这些因素的权值以及阈值(需要说明的是,低于该阀值不允许分配数据库连接,相反则允许分配数据库连),并通过总阈值判断出是否允许将将数据库连接池中空闲的数据库连接分配给应用层。需要说明的是,如果允许将将数据库连接池中空闲的数据库连接分配给应用层,则从数据库中的数据库连接池获取空闲的数据库连接分配给应用层,应用层通过数据库连接与数据库进行交互并执行Sql请求,并将执行结果存储到数据库中。
如图2所示,获取前述因素的权值以及阈值之后,确定各个因素的得分情况,并根据总分数判断是否允许将数据库连接池中空闲的数据库连接分配给应用层。例如,如果sql请求或者发送sql请求的应用层在各自的黑名单中,则相应的Actor的Score(得分)值为-∞,那么本次决策中Score<Threshold,则不允许分配数据库连接。
需要说明的是,数据库中可以存储Sql请求的历史执行结果,例如,数据库中的Sql请求黑名单或者白名单可以存储Sql请求的历史执行结果,其中,Sql请求的历史执行结果的存储内容如表1所示:
表1
这样,便于计算sql维度的历史执行结果和用户维度的sql的历史执行结果。
根据本申请的实施例,提供了一种用于数据库连接池的资源分配装置,该用于数据库连接池的资源分配装置,需要说明的是,本申请实施例所提供的用于数据库连接池的资源分配方法可以通过本申请实施例的用于数据库连接池的资源分配装置来执行,本申请实施例的用于数据库连接池的资源分配装置也可以用于执行本申请实施例的用于数据库连接池的资源分配方法。
图3是根据本申请实施例的用于数据库连接池的资源分配装置的示意图。如图3所示,该装置包括:接收单元302、判断单元304。
接收单元302用于接收客户端发送的数据库访问请求。客户端即为前述的应用程序。客户端需要与数据库交互时,客户端可以向数据库发送数据库访问请求,在数据库进行相应之前,数据层中的连接分配决策层可以首先拦截客户端发送的数据库访问请求,也即,连接分配决策层接收客户端发送的数据库访问请求,连接分配决策层用于接收到的根据数据库访问请求决定是否将数据库连接分配给该客户端。数据库访问请求包括查询、更改、添加、删除数据库中的数据的请求。
判断单元304用于根据数据库访问请求的历史执行结果判断是否允许将数据库连接池中空闲的数据库连接分配给客户端。数据库访问请求的历史执行结果是指该条数据库访问请求在本次请求之前的一段时间内被执行时记录的结果,其中,包括该数据库访问请求是否被成功执行,以及在该数据库访问请求被成功执行时,该历史执行结果还包括数据库访问请求的执行时间和/或出错率。
具体地,可以对数据库访问请求进行解析,得到解析结果,并根据解析结果查询数据列表中存储的数据库访问请求的历史执行结果,从而判断是否允许将数据库连接池中空闲的数据库连接分配给客户端。空闲的数据库连接即为可用的数据库连接。
优选地,在本申请实施例中,该资源分配装置还可以包括分配单元。分配单元用于如果判断出允许将数据库连接池中空闲的数据库连接分配给客户端的优先级,则将数据库连接池中的空闲的数据库连接分配给客户端。如果判断出不允许将数据库连接池中空闲的数据库连接分配给客户端,则不将数据库连接池中的空闲的数据库连接分配给客户端。具体地,当前述的历史结果表明该数据库访问请求在历史上表现良好,则将数据库连接池中的空闲的数据库连接分配给客户端,否则,不将数据库连接池中的空闲的数据库连接分配给客户端。
通过本申请实施例,采用接收客户端发送的数据库访问请求;根据数据库访问请求的历史执行结果判断是否允许将数据库连接池中空闲的数据库连接分配给客户端;如果判断出允许将数据库连接池中空闲的数据库连接分配给客户端,则将数据库连接池中的空闲的数据库连接分配给客户端,由于可以通过历史执行结果对数据库访问请求进行筛选,仅仅将空闲的数据库连接分配给历史表现良好的数据库访问请求,而不对历史表现差的数据库访问请求分配数据库连接,因此可以防止历史表现差的数据库访问请求占用数据库连接,节约数据库连接资源,达到了防止数据库连接池中的资源耗尽的效果。
优选地,在本申请实施例中,判断单元可以包括:获取模块和判断模块。
获取模块用于从历史执行结果中获取已执行的数据库访问请求的执行结果属性,其中,执行结果属性包括:执行时间和/或出错率,具体地,可以获取一段时间内已执行的数据库访问请求的执行结果属性,其中,执行结果属性与数据库访问请求一一对应。执行时间包括执行时间的起始点和执行时间的时长。出错率是指在一段时间内,同一数据库访问请求在执行时出错的次数和被执行的总次数的比值。
判断模块用于根据执行结果属性判断是否允许将数据库连接池中空闲的数据库连接分配给客户端。具体地,可以将执行结果属性进行分类存储,如果执行结果属性满足分配条件,则将其存储在第一列表(如,数据库访问请求白名单)中;如果执行结果属性不满足分配条件,则将其存储在第二列表(如,数据库访问请求黑名单)中。其中,如果判断出执行结果存储在第一列表中,则允许将数据库连接池中空闲的数据库连接分配给客户端;如果判断出执行结果存储在第二列表中,则不允许将数据库连接池中空闲的数据库连接分配给客户端。
通过本申请实施例,采用执行结果属性(即,执行时间和/或出错率)来判断是否允许将数据库连接池中空闲的数据库连接分配给客户端,由于执行时间和/或出错率易于记录和检测,并且可以进行量化,因此可以精确的判断出是否允许将数据库连接池中空闲的数据库连接分配给客户端,达到了在防止数据库连接池中的资源耗尽的同时,使得数据库连接的分配更准确的效果。
优选地,在本申请实施例中,执行结果属性可以包括一个或者多个,判断模块可以包括:第一获取子模块和第一判断子模块。
第一获取子模块用于当执行结果属性包括执行时间时,从已执行的数据库访问请求中获取执行时间超过第一预定时间阈值的数据库访问请求的第一个数,第一判断子模块用于在第一个数小于第一数量阈值时,判断出允许将数据库连接池中空闲的数据库连接分配给客户端。若第一个数大于等于第一数量阈值,则判断出不允许将数据库连接池中空闲的数据库连接分配给客户端。其中,若第一个数大于等于第一数量阈值,则其对应的执行时间可以存储在时间黑名单中。
或者,第一获取子模块用于当执行结果属性包括出错率时,从已执行的数据库访问请求中获取出现执行错误的数据库访问请求的第一比例,第一判断子模块用于在第一比例小于第一比例阈值时,判断出允许将数据库连接池中空闲的数据库连接分配给客户端。若第一比例大于等于第一比例阈值,则判断出不允许将数据库连接池中空闲的数据库连接分配给客户端。若第一比例大于等于第一比例阈值,则其对应的出错率可以存储在出错率黑名单中。
或者,第一获取子模块用于当执行结果属性包括执行时间和出错率时,从已执行的数据库访问请求中获取执行时间超过第一预定时间阈值的数据库访问请求的第一个数、且从已执行的数据库访问请求中获取出现执行错误的数据库访问请求的第一比例,第一判断子模块用于在第一个数小于第一数量阈值、且第一比例小于第一比例阈值时,判断出允许将数据库连接池中空闲的数据库连接分配给客户端。若第一个数大于等于第一数量阈值、和/或第一比例大于等于第一比例阈值,则判断出不允许将数据库连接池中空闲的数据库连接分配给客户端。
通过本申请实施例,采用预定时间阈值和/或比例阈值,由于可以将记录的执行时间与预定的时间阈值进行比较,和/或将记录的出错率与预定的比例阈值进行比较,从而可以得到更加准确的比较结果,因此量化跟准确,达到了在防止数据库连接池中的资源耗尽的同时,准确量化是否进行数据库连接分配的效果。
优选地,在本申请实施例中,资源分配装置还包括:第一创建单元和第一存储单元。第一创建单元用于在判断出允许将数据库连接池中空闲的数据库连接分配给客户端之后,创建数据库访问请求白名单。第一存储单元用于将允许将数据库连接池中空闲的数据库连接分配给客户端的数据库访问请求存储至数据库访问请求白名单中。
需要说明的是,在创建数据库访问请求白名单的同时,还可以创建数据库访问请求黑名单,其中,将不允许将数据库连接池中空闲的数据库连接分配给客户端的数据库访问请求存储至数据库访问请求黑名单中。
以数据库访问请求黑名单为例,该数据库访问请求黑名单可以以数据库表的方式直接存储在数据库中。具体地,在数据库访问请求黑名单中,可以存储数据库访问请求的模板、发生时间、执行时间、报错时间。例如,当存储数据库访问请求为Sql请求时,在数据库访问请求黑名单中可以存储形式如select*from ebpp_bill_info t where t.biz_type=#BizType#and card_no=#CardNo#的Sql请求的模板。发生时间是指数据库访问请求被发起的时间;执行时间是指执行数据库访问请求所消耗的时间;报错时间是指在执行数据库访问请求过程中如果出现错误,则错误上报的时间。优选地,在数据库访问请求黑名单中,还可以存储发起该数据库访问请求的用户的标识或者客户端的标识。
同理,数据库访问请求白名单中也可以存储上述内容,详细内容同上,再次不再赘述。不同的是,在数据库访问请求白名单和数据库访问请求黑名单中,针对同一存储内容存储的参数值不同。
需要说明的是,上述的数据库访问请求白名单和数据库访问请求黑名单中的存储内容可以用于量化各条数据库访问请求的历史执行结果。
优选地,在本申请实施例中,由于历史上使用同一数据库访问请求的客户端可以包括一个或者多个,因此,当使用同一数据库访问请求的客户端包括多个时,判断模块可以包括:第二获取子模块、第二判断子模块和第三判断子模块。
第二获取子模块用于当执行结果属性包括执行时间时,从已执行的数据库访问请求中获取执行时间超过第二预定时间阈值的数据库访问请求的第二个数,第二判断子模块用于判断已执行的数据库访问请求中由前述的客户端发送的数据库访问请求的执行结果是否满足预定条件;第三判断子模块用于在第二个数小于第二数量阈值、且执行结果满足预定条件时,判断出允许将数据库连接池中空闲的数据库连接分配给客户端。否则,判断出不允许将数据库连接池中空闲的数据库连接分配给客户端。
或者,第二获取子模块用于当执行结果属性包括出错率时,从已执行的数据库访问请求中获取出现执行错误的数据库访问请求的第二比例,第二判断子模块用于判断已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果是否满足预定条件;第三判断子模块用于在第二比例小于第二比例阈值、且执行结果满足预定条件时,判断出允许将数据库连接池中空闲的数据库连接分配给客户端。否则,判断出不允许将数据库连接池中空闲的数据库连接分配给客户端。
或者,第二获取子模块,用于当执行结果属性包括执行时间和出错率时,从已执行的数据库访问请求中获取执行时间超过第二预定时间阈值的数据库访问请求的个数、且从已执行的数据库访问请求中获取出现执行错误的数据库访问请求的第二比例,第二判断子模块,用于判断已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果是否满足预定条件;第三判断子模块,用于在第二个数小于第二数量阈值、且比例小于第二比例阈值以及执行结果满足预定条件时,判断出允许将数据库连接池中空闲的数据库连接分配给客户端。
其中,第二预定时间阈值可以与前述的第一预定时间阈值相同。第二数量阈值可以与前述的第一数量阈值相同。第二比例阈值可以与前述的第一比例阈值形同。
通过本申请实施例,采用客户端的历史表现对数据库访问请求进行筛选,由于有些客户端使用某一数据库访问请求时的执行时间和/或出错率可能满足允许将数据库连接池中空闲的数据库连接分配给该客户端的条件,而另一些客户端在使用同一数据库访问请求时的执行时间和/或出错率可能不满足允许将数据库连接池中空闲的数据库连接分配给该客户端的条件,因此可以通过客户端的标识信息进行过滤,防止个别恶意客户端频繁执行耗时较长sql请求,导致整个数据库相应缓慢,达到了的通过客户端确定是否允许将数据库连接池中空闲的数据库连接分配给该客户端的效果。
优选地,在本申请实施例中,由于客户端在执行数据库访问请求时,也可以记录执行时间和/或出错率属性,因此第二判断子模块可以包括:获取孙模块和判断孙模块。
获取孙模块用于从已执行的数据库访问请求中由客户端发送的数据库访问请求中获取执行时间超过第三预定时间阈值的数据库访问请求的第三个数,判断孙模块用于在第三个数小于第三数量阈值时,判断出已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果满足预定条件。否则,判断出已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果不满足预定条件。
或者,获取孙模块用于从已执行的数据库访问请求中由客户端发送的数据库访问请求中获取出现执行错误的数据库访问请求的第三比例,判断孙模块用于第三比例小于第三比例阈值时,判断出已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果满足预定条件。否则,判断出已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果不满足预定条件。
或者,获取孙模块用于从已执行的数据库访问请求中由客户端发送的数据库访问请求中获取执行时间超过第三预定时间阈值的数据库访问请求的第三个数、且从已执行的数据库访问请求中由客户端发送的数据库访问请求中获取出现执行错误的数据库访问请求的第三比例,判断孙模块用于在第三个数小于第三数量阈值、且第三比例小于第三比例阈值时,判断出已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果满足预定条件。否则,判断出已执行的数据库访问请求中由客户端发送的数据库访问请求的执行结果满足预定条件。
通过本申请实施例,采用执行时间和/或出错率属性来判断客户端发送的数据库访问请求的执行结果满足预定条件,由于与判断数据库访问请求的判断逻辑类似,因此达到了整个数据库连接资源分配的判断逻辑一致且简单的效果。
优选地,在本申请实施例中,资源分配装置还包括:第二创建单元和第二存储单元。第二创建单元用于在判断出允许将数据库连接池中空闲的数据库连接分配给客户端之后,创建客户端白名单。第二存储单元用于将被允许分配数据库连接池中空闲的数据库连接的客户端存储至客户端白名单中。
需要说明的是,在创建客户端白名单的同时,可以创建客户端黑名单,其中,将被允许分配数据库连接池中空闲的数据库连接的客户端之外的客户端存储至客户端黑名单中。
以客户端黑名单为例,该客户端黑名单可以以数据库表的方式直接存储在数据库中。具体地,在客户端黑名单中,可以存储数据库访问请求的模板、发生时间、执行时间、报错时间和客户端标识。例如,当存储数据库访问请求为Sql请求时,在客户端黑名单中可以存储形式如select*from ebpp_bill_info t where t.biz_type=#BizType#and card_no=#CardNo#的Sql请求的模板。发生时间是指数据库访问请求被发起的时间;执行时间是指执行数据库访问请求所消耗的时间;报错时间是指在执行数据库访问请求过程中如果出现错误,则错误上报的时间。需要说明的是,客户端标识可以为用户标识,例如,其可以是该用户的支付宝账号。
同理,客户端白名单中也可以存储上述内容,详细内容同上,再次不再赘述。不同的是,在客户端白名单和客户端黑名单中,针对同一存储内容存储的参数值不同。
需要说明的是,上述的客户端白名单和客户端黑名单中的存储内容可以用于量化各个客户端的历史执行结果。
需要说明的是,在本申请的前述实施例中,在将数据库连接池中的空闲的数据库连接分配给客户端之后,客户端执行前述的数据库访问请求并将执行结果属性存储在数据库列表中。这样,可以为下次是否给发送该数据库访问请求的客户端分配数据库连接提供分配依据。
另外,在本申请的前述实施例中,除了通过上述实施例所述的手段来判断是否允许给客户端分配数据库连接之外,还可以通过数据库访问请求所对应的业务优先级和/或数据库访问请求本身的查询条件(如,查询条件的限定值)来判断。这样,可以防止某些优先级较低的业务的sql请求出现问题,导致全部业务都受到影响。
具体地,当数据库连接池中的资源数低于一定阀值时,给业务优先级高的业务分配数据库连接。例如:对于支付宝账单缴费类业务而言:业务流水创建支付销账等的优先级远高于欠费单的落地等辅助功能,如果数据库连接池资源紧张时,前者的资源获取优先级更高。而对于查询条件而言,如果某些sql查询条件的限定值区分能力差,并且执行时耗时长,返回结果多,则执行数据库连接分配处理。
优选地,可以综合数据库访问请求的历史执行结果、客户端的历史表现结果、请求所对应的业务优先级以及请求本身的查询条件的限定值四个因素来判断是否允许给客户端分配数据库连接。
显然,本领域的技术人员应该明白,上述的本申请的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请不限制于任何特定的硬件和软件结合。
以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。