掌桥专利:专业的专利平台
掌桥专利
首页

一种函数的分析方法、装置及电子设备

文献发布时间:2023-06-19 09:35:27


一种函数的分析方法、装置及电子设备

技术领域

本公开涉及数据库技术领域,尤其涉及一种函数的分析方法、装置及电子设备。

背景技术

读写分离,是指让主机服务器处理事务性增、改、删操作,而备机服务器处理SELECT查询操作。

在处理函数过程中,现有的读写分离方案通常需要用户单独配置函数黑白名单,以识别函数的读写类型,进而做到读取数据库函数(可称为读函数)分发备机服务器,写入数据库函数(可称为写函数)发送主机服务器,提高集群整体处理能力。这样单独配置函数黑白名单的方案对用户来说非常繁琐,尤其是应用复杂并用到大量的函数时,配置黑白名单会变得困难且容易出错。

发明内容

为了解决上述技术问题或者至少部分地解决上述技术问题,本公开提供了一种函数的分析方法、装置及电子设备。

本公开提供了一种函数的分析方法,所述方法包括:当程序启动后,获取函数并对黑名单进行检查;其中,所述函数包括用户定义函数和数据库系统的系统函数;所述黑名单用于记录所述函数中的写入数据库函数;如果所述黑名单中记录的写入数据库函数为空,则根据读写属性从所述系统函数中确定第一写入数据库函数;如果所述黑名单中记录有写入数据库函数,则基于所述黑名单执行所述用户定义函数,并根据执行结果在所述用户定义函数中确定第二写入数据库函数;将所述第一写入数据库函数和所述第二写入数据库函数加入至所述黑名单。

进一步,所述根据读写属性从所述系统函数中确定第一写入数据库函数,包括:从预先建立的数据库表中查询读写属性为不稳定变量属性值的系统函数;其中,所述数据库表用于存储所述系统函数;将查询得到的系统函数确定为第一写入数据库函数。

进一步,所述基于所述黑名单执行所述用户定义函数,并根据执行结果在所述用户定义函数中确定第二写入数据库函数,包括:从所述用户定义函数中解析出函数名称,判断所述函数名称是否记录于所述黑名单中;如果没有,将所述用户定义函数发送给备机服务器执行;接收所述备机服务器对所述用户定义函数的执行结果;当所述执行结果为执行错误时,将所述用户定义函数确定为第二写入数据库函数。

进一步,所述方法还包括:将记录于所述黑名单中的写入数据库函数发送给主机服务器执行;接收所述主机服务器对所述用户定义函数的执行结果。

进一步,所述用户定义函数的默认读写属性为不稳定变量属性值。

进一步,所述方法还包括:根据用户指令将所述用户定义函数配置为第三写入数据库函数。

进一步,所述方法还包括:将所述黑名单存储于预定义的容器中;其中,所述容器用于存储不重复的写入数据库函数。

本公开还提供一种函数的分析装置,所述装置包括:检查模块,用于获取函数并对黑名单进行检查;其中,所述函数包括用户定义函数和数据库系统的系统函数;所述黑名单用于记录所述函数中的写入数据库函数;第一确定模块,用于如果所述黑名单中记录的写入数据库函数为空,则根据读写属性从所述系统函数中确定第一写入数据库函数;第二确定模块,用于如果所述黑名单中记录有写入数据库函数,则基于所述黑名单执行所述用户定义函数,并根据执行结果在所述用户定义函数中确定第二写入数据库函数;加入黑名单模块,用于将所述第一写入数据库函数和所述第二写入数据库函数加入至所述黑名单。

本公开还提供一种电子设备,包括处理器和存储装置;所述存储装置上存储有计算机程序,所述计算机程序在被所述处理器运行时执行上述方法。

本公开还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行上述方法的步骤。

本公开实施例提供的技术方案与现有技术相比具有如下优点:

本公开实施例提供的一种函数的分析方法、装置及电子设备,当程序启动后,获取函数并检查黑名单是否为空;如果黑名单中记录的写入数据库函数为空,则从系统函数中确定第一写入数据库函数;如果黑名单不为空,则基于黑名单执行用户定义函数,并根据执行结果在用户定义函数中确定第二写入数据库函数;最后将第一写入数据库函数和第二写入数据库函数加入至黑名单。上述方式无需用户配置函数的黑白名单,而是从系统函数和用户定义函数中自动分离出写入数据库函数,该方式能够明显简化配置黑白名单的工作难度,降低用户工作量和配置错误带来的影响。

附图说明

此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。

为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本公开实施例所述函数的分析方法流程图;

图2为本公开实施例所述函数的分析装置结构框图;

图3为本公开实施例所述电子设备的结构示意图。

具体实施方式

为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。

在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。

考虑到现有配置函数黑白名单的方式非常繁琐、易出错,本公开实施例提供了一种函数的分析方法、装置及电子设备。为便于理解,以下对本公开实施例进行详细介绍。

实施例一:

本实施例提供一种函数的分析方法,参照图1,该方法可以包括如下步骤:

步骤S102,当程序启动后,获取函数并对黑名单进行检查;其中,函数包括系统函数和用户定义函数;黑名单用于记录函数中的写入数据库函数。

在一些可能的实现方式中,上述程序可以为添加在主机服务器中的驱动程序,也可以为设计的代理(Proxy)程序等。函数可以包括数据库系统初始化时自带的系统函数,和用户为满足实际需求而预先创建的用户定义函数;同时,根据函数的操作类型为读取操作或写入操作,函数可分为写入数据库函数(即写函数)和读取数据库函数(即读函数);其中,写入数据库函数诸如为更新函数、修改数据库状态函数和不稳定函数等。为了便于准确地分离读函数和写函数,本实施例可以将写函数加入至黑名单中。对黑名单进行检查,可理解为检查黑名单中记录的写函数是否为空,而后基于检查结果执行后续步骤。

步骤S104,如果黑名单中记录的写入数据库函数为空,则根据读写属性从系统函数中确定第一写入数据库函数。

系统函数既包括读函数也包括写函数,其中,写函数可以通过设定的读写属性(provolatile)为不稳定变量属性值(表示为provolatile='v')确定;由此,将读写属性为不稳定变量属性值的系统函数确定为第一写入数据库函数。

步骤S106,如果黑名单中记录有写入数据库函数,则基于黑名单执行用户定义函数,并根据执行结果在用户定义函数中确定第二写入数据库函数。

如果黑名单中记录有写函数,则记录的写函数至少包括系统函数中的写函数,还可能包括用户定义函数中的写函数,比如在创建用户定义函数的同时也配置了黑名单。然而,对于用户未配置的用户定义函数,其操作类型为读函数或写函数是不确定的,该用户定义函数并不会记录于黑名单中;在此情况下,为了降低操作类型的识别复杂度,可以直接将没有记录于黑名单中的函数作为读函数。

在基于黑名单执行用户定义函数的过程中,将记录于黑名单中的函数发送给主机服务器执行,记录于黑名单中的函数为系统函数和用户定义函数中的写函数。将没有记录于黑名单中的函数发送给备机服务器执行,没有记录于黑名单中的函数被认为是读函数。可以理解的是,上述被认为是读函数的用户定义函数实际上可能是写函数,那么将其发送给备机服务器执行的执行结果将会出现错误,从而可以基于出现错误的执行结果将用户定义函数确定为写函数,也即第二写入数据库函数。

步骤S108,将第一写入数据库函数和第二写入数据库函数加入至黑名单。黑名单为系统函数中的第一写入数据库函数和用户定义函数中的第二写入数据库函数的记录文件;本实施例可以将黑名单存储于预定义的容器中;其中,容器用于存储不重复的写入数据库函数,诸如该容器为全局静态的HashSet,HashSet的增删改查、容纳方法的时间复杂度设定为O(1),效率较高。至此,将系统函数和用户定义函数中的写函数均加入至黑名单,准确地实现了读函数和写函数的分离。

本公开实施例提供的函数的分析方法,在检查黑名单记录的写函数为空的情况下,从系统函数中确定第一写入数据库函数;在检查黑名单记录的写函数不为空的情况下,基于黑名单执行用户定义函数,并根据执行结果在用户定义函数中确定第二写入数据库函数;最后将第一写入数据库函数和第二写入数据库函数加入至黑名单。上述方式利用读写属性自动从系统函数中分离出写函数,以及利用执行结果自动从用户定义函数中分离出写函数,无需用户配置函数的黑白名单,能够明显简化配置黑白名单的工作难度,降低用户工作量和配置错误带来的影响。

为了更好地理解函数的分析方法,接下来对该方法的上述各步骤展开描述。

当函数较多,比如包含updateXXX1,…,updateXXX100,selectXXX1,…,selectXXX100等大量函数时,如果通过连接参数BlackList配置函数的黑白名单将非常麻烦,故可以通过函数的分析方法确定函数中的写函数。

在一种实施例中,系统函数和用户定义函数均存储在系统表(如sys_proc)中。该系统表记录的信息包括表示函数的读写属性的字段provolatile,该字段有多种取值情况,其中取字段值='v',也即provolatile='v'时,表示不稳定变量属性值,对应的表示该函数为写函数。当系统函数和用户定义函数被设定读写属性为provolatile='v'时,确定系统函数和用户定义函数为写函数。当用户未设定用户定义函数的读写属性时,用户定义函数的默认读写属性为不稳定变量属性值。

在从系统函数中确定第一写入数据库函数的过程中,如果直接从上述系统表中查找provolatile='v'的函数,将会查找到包含系统函数和用户定义函数中的写函数,导致第一写入数据库函数的查找结果不准确。基于此,本实施例提供一种确定第一写入数据库函数的具体实现方式,包括:从预先建立的数据库表中查询读写属性为不稳定变量属性值(provolatile='v')的系统函数;将查询得到的系统函数确定为第一写入数据库函数。而后,可以将第一写入数据库函数加入至黑名单。

本实施例可以通过迁移工具、管理工具或者其他方式,预先建立只用于存储系统函数的数据库表。由于数据库表中只包含系统函数,因此从数据库表中确定出的第一写入数据库函数准确性更高。

在将数据库表中的第一写入数据库函数加入至黑名单后,可以删除数据库表。此时,黑名单中记录有写入数据库函数,从而可以与用户端建立连接,确定用户定义函数中的第二写入数据库函数,具体可参照如下步骤(1)-(4)所示:

(1)从用户定义函数中解析出函数名称,判断函数名称是否记录于黑名单中。

从SQL(Structured Query Language,结构化查询语言)用户定义函数中解析出函数名称,如函数名称为updateXXX1;判断该函数名称是否记录于黑名单中;如果没有,则执行如下步骤(2)。

(2)将用户定义函数发送给备机服务器执行;

诸如对于第一次执行的用户定义函数,它并不会记录于黑名单中,将该用户定义函数发送给备机服务器执行。

(3)接收备机服务器对用户定义函数的执行结果;

如果用户定义函数实际上为写函数,将其发送给备机服务器后,备机服务器将执行失败,并返回执行错误的结果,该结果诸如为如下消息:ERROR:cannot execute UPDATEin a read-only transaction。

如果用户定义函数本身为读函数,将其发送给备机服务器后,备机服务器将直接执行成功,返回执行成功给应用层,在此情况下,无需对用户定义函数进行处理。

(4)当执行结果为执行错误时,将用户定义函数确定为第二写入数据库函数。

在接收到备机服务器返回的执行错误的结果后,将该执行错误的用户定义函数确定为第二写入数据库函数;具体的,可以解析该执行错误的用户定义函数的函数名称,并将解析的函数名称加入至黑名单。

在此之后,还可以将该执行失败的用户定义函数转发给主机服务器执行,且无论执行结果是否成功,主机服务器均将该函数的执行结果返回给应用层。

在一种实施例中,还包括将记录于黑名单中的写入数据库函数发送给主机服务器执行;以及接收主机服务器对用户定义函数的执行结果。

记录于黑名单中的写入数据库函数可以为通过上述步骤(1)判定的记录于黑名单中用户定义函数,表示该用户定义函数已被确定为写函数,可以直接发送给主机服务器执行。比如:由于在第一次执行updateXXX1函数的过程中,通过以上步骤(1)-(4)已经将updateXXX1函数确定为写函数并加入至黑名单,因此在第二次执行updateXXX1函数时,可以直接将其发送给主机服务器执行。

此外,本实施例提供的函数的分析方法还可以包括:根据用户指令将用户定义函数配置为第三写入数据库函数。

具体的,当用户定义函数较少时,比如包含updateXXX1,…,updateXXX3,selectXXX等函数。此时参照如下用户指令配置黑名单:BlackList=updateXXX1;updateXXX2,黑名单中的updateXXX1函数、updateXXX2函数均为第三写入数据库函数。

基于该黑名单配置结果,在用户启动程序后,首先读取黑名单中的写函数,将其存储在容器HashSet中。此时黑名单不为空,所以不会读取系统函数中的写函数。直接执行用户定义函数(如updateXXX1),此函数updateXXX1包含在黑名单中,直接发送给主机服务器。在执行用户定义函数(如updateXXX3)时,此函数updateXXX3虽然实际为写函数,但是并不包含在黑名单中,因此将其发送给备机服务器执行,根据执行结果将其确定为写函数,并加入至黑名单。在本实施例中,可以将用户漏配置的写函数(updateXXX3)加入至黑名单中,减少配置错误带来的影响。

综上,上述实施例对于函数较多的场景,能够在驱动层自动确定函数中的写函数并加入黑名单,具体包括:利用读写属性确定系统函数中的写函数,以及利用执行结果确定用户定义函数中的写函数。无需用户配置黑白名单也能够对读函数和写函数进行准确分发,让用户使用起来更为方便、智能,明显减少了用户的工作量,而且还能够将用户漏配置的写函数写入到黑名单中,减少配置错误带来的影响。

实施例二:

参照图2,本实施例提供一种函数的分析装置,装置包括:

检查模块202,用于当程序启动后,对黑名单进行检查;其中,黑名单用于记录写入数据库函数;

第一确定模块204,用于如果黑名单中记录的写入数据库函数为空,则从预先建立的数据库表中确定第一写入数据库函数;其中,数据库表用于存储数据库系统的系统函数;

第二确定模块206,用于如果黑名单中记录有写入数据库函数,则基于黑名单执行用户定义函数,并根据执行结果在用户定义函数中确定第二写入数据库函数;

加入黑名单模块208,用于将第一写入数据库函数和第二写入数据库函数加入至黑名单。

本公开实施例提供的函数的分析装置,在检查黑名单记录的写函数为空的情况下,从系统函数中确定第一写入数据库函数;在检查黑名单记录的写函数不为空的情况下,基于黑名单执行用户定义函数,并根据执行结果在用户定义函数中确定第二写入数据库函数;最后将第一写入数据库函数和第二写入数据库函数加入至黑名单。上述方式利用属性自动从系统函数中分离出写函数,以及利用执行结果自动从用户定义函数中分离出写函数,无需用户配置函数的黑白名单,能够明显简化配置黑白名单的工作难度,降低用户工作量和配置错误带来的影响。

本实施例所提供的装置,其实现原理及产生的技术效果和前述实施例相同,为简要描述,本实施例部分未提及之处,可参考前述实施例中相应内容。

基于前述实施例,本实施例给出了一种电子设备,如图3所示,包括处理器302和存储装置304;存储装置304上存储有计算机程序,计算机程序在被处理器302运行时执行上述方法。

进一步,本实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器运行时执行上述方法的步骤。

需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

以上所述仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文所述的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

相关技术
  • 一种函数的分析方法、装置及电子设备
  • 一种调用函数的分析方法及装置
技术分类

06120112222362