首页> 中国专利> 数据库数据处理方法、装置、计算机设备和存储介质

数据库数据处理方法、装置、计算机设备和存储介质

摘要

本申请涉及一种数据库数据处理方法、装置、计算机设备和存储介质。所述方法包括:接收数据库数据处理请求,并获取所述数据库处理请求对应的自定义拦截器;通过所述自定义拦截器获取参数集合,并从所述参数集合中获取节点封装对象;查询与所述节点封装对象对应的原始处理语句;从所述参数集合中获取数据属性;根据所述数据属性对所述原始处理语句进行处理得到目标处理语句;执行所述目标处理语句得到数据处理结果。采用本方法能够降低内存占用率。

著录项

  • 公开/公告号CN112988787A

    专利类型发明专利

  • 公开/公告日2021-06-18

    原文格式PDF

  • 申请/专利号CN202110531490.8

  • 发明设计人 吴亚峰;

    申请日2021-05-17

  • 分类号G06F16/242(20190101);G06F16/2455(20190101);G06F16/28(20190101);

  • 代理机构44224 广州华进联合专利商标代理有限公司;

  • 代理人姜晓云

  • 地址 518048 广东省深圳市福田区新洲路立交桥西北侧新洲广场华丰大厦第3层B1-A

  • 入库时间 2023-06-19 11:29:13

说明书

技术领域

本申请涉及数据库技术领域,特别是涉及一种数据库数据处理方法、装置、计算机设备和存储介质。

背景技术

在软件系统百花齐放的当代,关系型数据库是保存业务数据的重要工具。在多类互联网应用场景中,用户会访问前端web页面进行数据处理,例如数据查询操作,web应用将关系型数据库返回的查询结果在前端页面进行展示。例如在购物网站,用户针对某一类商品的检索。受到前端页面大小的限制,一页页面往往很难显示所有的查询结果。为了用户的浏览方便,前端页面对查询结果进行分页的显示。类似书本翻页的形式,用户通过翻页查看更多的查询结果。

以分页查询为例,分页查询的方法有两类。第一类是后端把数据库查询结果全部传输给前端,由前端页面进行分页展示处理的前端分页方法。第二类是后端将数据库的查询结果进行分页处理,并将对应页面的数据传输给前端的后端分页方法。

MyBatis是一款持久层框架,包含了对JDBC(Java数据库连接)的封装,互联网应用系统使用MyBatis连接业务层和关系型数据库。传统的数据处理一般都是内存处理,例如以分页查询为例,分页查询技术中存在一种内存分页方法,该内存分页方法使用MyBatis提供的原生的RowBounds类,将数据库的查询结果暂存在Java的内存中,通过计算分页查询的页数和每页的显示查询记录的数量,生成新的查询结果集合,后端将此分页查询结果集合返回给前端。

然而内存分页方法需要首先将所有的查询结果暂存在Java内存中,再进行过滤处理。由于Java内存存在性能瓶颈,在数据量大的场景中,如果所需要处理的数据的结果较大,会出现内存溢出的风险。

发明内容

基于此,有必要针对上述技术问题,提供一种能够降低内存占用率的数据库数据处理方法、装置、计算机设备和存储介质。

一种数据库数据处理方法,所述方法包括:

接收数据库数据处理请求,并获取所述数据库处理请求对应的自定义拦截器;

通过所述自定义拦截器获取参数集合,并从所述参数集合中获取节点封装对象;

查询与所述节点封装对象对应的原始处理语句;

从所述参数集合中获取数据属性;

根据所述数据属性对所述原始处理语句进行处理得到目标处理语句;

执行所述目标处理语句得到数据处理结果。

在其中一个实施例中,所述获取所述数据库处理请求对应的自定义拦截器,包括:

调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法获取拦截器的责任与数据库数据处理请求对应的自定义拦截器。

在其中一个实施例中,所述调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法获取拦截器的责任与数据库数据处理请求对应的自定义拦截器,包括:

调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法遍历责任链中的拦截器;

获取责任链中的责任与数据库数据处理请求对应的自定义拦截器。

在其中一个实施例中,所述方法还包括:

创建实现了自定义拦截接口的自定义拦截器,并在所述自定义拦截器的注解中定义自定义拦截器的责任;

重写所述自定义拦截器的拦截方法;

在启动时,将处理结果处理组件进行组件实例化,并将所述自定义拦截器对所述处理结果处理组件的代理对象实例化;

将所述自定义拦截器存入至拦截器链中,所述拦截器链通过责任链的模型记录了所有拦截器。

在其中一个实施例中,所述通过所述自定义拦截器获取参数集合,包括:

通过重写的所述自定义拦截器的拦截方法,获取代理的处理结果处理组件的代理对象;

从所述代理对象中获取参数集合。

在其中一个实施例中,所述从所述参数集合中获取节点封装对象之前,还包括:

判断所述参数集合中是否包含预设处理参数;

当所述参数集合中包含预设处理参数时,则继续从所述参数集合中获取节点封装对象;

当所述参数集合中未包含预设处理参数时,则退出所述自定义拦截器,并通过处理结果处理组件中的预设方法进行数据处理。

在其中一个实施例中,所述查询与所述节点封装对象对应的原始处理语句之后,还包括:

判断缓存中是否存储了与所述节点封装对象对应的总记录数;

若是,则直接从缓存中获取所述总记录数,否则对所述原始处理语句进行包装得到用于计算总记录数的总数查询语句;

执行所述总数查询语句得到总记录数;

所述根据所述数据属性对所述原始处理语句进行处理得到目标处理语句,包括:

根据所述总记录数以及所述数据属性对所述原始处理语句进行处理得到目标处理语句。

在其中一个实施例中,所述查询与所述节点封装对象对应的原始处理语句之后,还包括:

对所述原始处理语句进行格式化处理。

在其中一个实施例中,所述根据所述数据属性对所述原始处理语句进行处理得到目标处理语句,包括:

通过预设的不同数据的类型适配,将所述数据属性嵌入至所述原始处理语句中得到目标处理语句。

在其中一个实施例中,所述方法还包括:

通过预设追踪工具生成跨度事件,并启动所述跨度事件;

通过所述跨度事件记录所述自定义拦截器的每一处理步骤的持续时间;

在所述自定义拦截器处理得到数据处理结果后,保存所述持续时间至所述预设追踪工具的日志中,并结束所述跨度事件。

在其中一个实施例中,所述方法还包括:

通过所述预设追踪工具的服务端查询所述日志,以得到所述自定义拦截器的每一处理步骤的持续时间。

在其中一个实施例中,所述方法还包括:

预先在所述数据库中建立数据处理结果存储表;

所述执行所述目标处理语句得到数据处理结果之后,包括:

通过所述自定义拦截器生成日志插入语句,并执行所述日志插入语句,以将数据处理结果插入至所述处理结果存储表中。

一种数据库数据处理装置,所述装置包括:

接收模块,用于接收数据库数据处理请求,并获取所述数据库处理请求对应的自定义拦截器;

节点封装对象获取模块,用于通过所述自定义拦截器获取参数集合,并从所述参数集合中获取节点封装对象;

原始处理语句获取模块,用于查询与所述节点封装对象对应的原始处理语句;

数据属性获取模块,用于从所述参数集合中获取数据属性;

目标处理语句生成模块,用于根据所述数据属性对所述原始处理语句进行处理得到目标处理语句;

数据处理模块,用于执行所述目标处理语句得到数据处理结果。

一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现上述的方法的步骤。

一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述的方法的步骤。

上述数据库数据处理方法、装置、计算机设备和存储介质,在接收到数据库数据处理请求后,则调用自定义拦截器来获取参数集合,并从参数集合中获取节点封装对象,从而可以获取到与节点封装对象对应的原始处理语句,且仅需要从参数集合中获取本次处理的数据属性,这样根据该数据属性以及原始处理语句得到目标处理语句,从而得到数据处理结果,不需要将所有的数据均查询完成后放在内存中,数据库执行效率、程序内存使用占用率得到明显提升。

附图说明

图1为一个实施例中数据库数据处理方法的应用环境图;

图2为一个实施例中数据库数据处理方法的流程示意图;

图3为一个实施例中自定义拦截器的嵌入方法的流程示意图;

图4为另一个实施例中数据库数据处理方法的流程示意图;

图5为一个实施例中数据库数据处理装置的结构框图;

图6为一个实施例中计算机设备的内部结构图。

具体实施方式

为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。

本申请提供的数据库数据处理方法,可以应用于如图1所示的应用环境中。其中,终端102通过网络与服务器104进行通信,终端102发送数据库数据处理请求,从而服务器104可以接收到该数据库数据处理请求,调用自定义拦截器来获取参数集合,并从参数集合中获取节点封装对象,从而可以获取到与节点封装对象对应的原始处理语句,且仅需要从参数集合中获取本次处理的数据属性,这样根据该数据属性以及原始处理语句得到目标处理语句,从而得到数据处理结果,不需要将所有的数据均查询完成后放在内存中,数据库执行效率、程序内存使用占用率得到明显提升。其中,终端102可以但不限于是各种个人计算机、笔记本电脑、智能手机、平板电脑和便携式可穿戴设备,服务器104可以用独立的服务器或者是多个服务器组成的服务器集群来实现,优先地,本实施例中的服务器是基于MyBatis框架实现的。

在一个实施例中,如图2所示,提供了一种数据库数据处理方法,以该方法应用于图1中的服务器为例进行说明,包括以下步骤:

S202:接收数据库数据处理请求,并获取数据库处理请求对应的自定义拦截器。

具体地,数据库数据处理请求可以包括对数据库中的数据进行查询、删除、插入以及更新的请求,本实施例中主要以数据库分页查询处理请求进行介绍。

自定义拦截器是预先生成的,其是基于MyBatis框架实现的,在本实施例中,通过插件的方式将自定义拦截器融入MyBatis框架的生命周期,以将自定义拦截器嵌入MyBatis框架的原生的拦截器链中,采用责任链的设计模式。其中责任链模式是指拦截器链(IntercetorChain)使用一个集合(List)记录了所有拦截器的实例。

其中,在实际处理的时候,当MyBatis框架处理数据库数据处理请求时,也即当一个数据处理请求(查询,删除,更新,新增)请求从服务层送至持久层时,首先匹配到上述的自定义拦截器,然后通过该自定义拦截器来实现数据库数据的处理。其中自定义拦截器的匹配方式可以是按照责任链的顺序通过遍历所有的拦截器的实例,以判断数据库数据处理请求是否为所遍历的拦截器的责任,其中判断依据可以是数据处理请求类型是否在拦截器的方法的注解中有说明,例如在Intercepts注解中说明,若有,则该数据库数据处理请求是该拦截器的责任。若不是该拦截器的责任,那么继续调用拦截器链的下一个拦截器,直至找到符合拦截责任的拦截器。

S204:通过自定义拦截器获取参数集合,并从参数集合中获取节点封装对象。

具体地,参数集合是在代理对象中的,其通过自定义拦截器的方法进行拦截得到,参数集合中定义了数据处理请求的所有参数,例如数据处理类型的标识,例如是否为分页查询,分页查询对象中的每页大小、页数、排序方式等。主要重点说明的是,参数集合中还包括节点封装对象,其中节点封装对象指的是Mybatis技术架构中,执行一个数据操作请求(查询,删除,更新,新增)的节点,该节点由程序开发人员编写在数据库表映射文件(Mapper)的xml格式的文件中。在本实施例中,重点关注查询节点,每次新增一个查询,就需要编写一个查询节点。

S206:查询与节点封装对象对应的原始处理语句。

具体地,由于每次数据处理均生成新的对应类型的节点,因此服务器可以从节点封装对象查找到对应的原始处理语句,即原始SQL语句。

S208:从参数集合中获取数据属性。

具体地,此处的数据属性是指一次处理的数据的属性,例如分页处理时,该数据属性是指每页大小、页数、排序方法。其中分页查询的每页大小、页数、排序方法是在intercept的方法中获取本次请求的参数集合中获取的,这些是发起请求时就决定了的,由程序开发人员编写在Mapper中。

S210:根据数据属性对原始处理语句进行处理得到目标处理语句。

具体地,服务器通过数据属性对原始处理语句进行加工处理得到目标处理语句,其中处理的方式可以是通过预设的不同数据的类型适配,将数据属性嵌入到对应的原始处理语句中生成目标处理语句。

例如,当为分页查询的时候,则可以根据分页查询对象中的每页大小、页数、排序方式通过预设的不同数据的类型适配,将分页查询内容嵌入到SQL中,生成分页查询SQL。

S212:执行目标处理语句得到数据处理结果。

具体地,服务器执行该目标处理语句得到数据处理结果,例如执行分页查询SQL,获取分页查询结果;将分页查询结果包装成集合(List),返回给MyBatis。

其中,上述数据库处理方法中实现了物理分页的分页查询方法,即在分页查询时,直接指定了将要查询的页的序号及每页显示数量。对比内存分页方法,本实施例中无需将所有的查询结果放置于内存中再经过筛选,优化了程序执行效率,减少了程序的运行耗时。

其中在分页查询的时候,区分一个查询是否是分页查询,一般由软件系统的服务层决定。在应用软件的分层式架构中,主要可分为:1)展示层:处理、收集、分发用户请求,返回数据;2)应用层:业务数据的逻辑处理;3)数据持久层:连接数据库,对数据的操作层,供应用层的方法调用。由用户的请求到数据库的流程依次为:用户请求,展示层,应用层,数据持久层,数据库。本发明的主要内容是在软件持久层的扩展。在软件在不同使用场景中的查询是否是分页查询,常由该场景的特性而人为的决定。例如:关于产品列表的查询,会始终是分页查询,不会因为检索结果少就不是分页查询,哪怕只有不到一页的数据,也是分页查询;关于用户类型的查询,由于其查询结果一般是可控的、有限的,则始终是非分页查询。这些性质在软件服务层调用软件持久层时,由程序编写人员在编写调用方法的时候决定。并在软件持久层,设置关键字(本发明使用pageable关键字),来区分一个查询是否是分页查询。例如,考虑电子购物平台的一个使用场景,2020年该平台食品类的产品数量总数是2500款,用户进行对食品品类进行分页查询,每页展示50个查询结果。

上述数据库数据处理方法,在接收到数据库数据处理请求后,则调用自定义拦截器来获取参数集合,并从参数集合中获取节点封装对象,从而可以获取到与节点封装对象对应的原始处理语句,且仅需要从参数集合中获取本次处理的数据属性,这样根据该数据属性以及原始处理语句得到目标处理语句,从而得到数据处理结果,不需要将所有的数据均查询完成后放在内存中,数据库执行效率、程序内存使用占用率得到明显提升。

在其中一个实施例中,获取数据库处理请求对应的自定义拦截器,包括:调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法获取拦截器的责任与数据库数据处理请求对应的自定义拦截器。

具体地,在分页查询的时候,处理结果处理组件可以是查询结果处理组件ResultHandler,在使用MyBatis进行查询操作时,会调用ResultHandler组件的query方法,即处理结果处理组件的处理方法,触发Java虚拟机(JDK)的动态代理机制,以调用代理类(Plugin)的触发方法(invoke),从而调用自定义拦截器的intercept方法,进行查询并生成查询结果对象。

在其中一个实施例中,调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法获取拦截器的责任与数据库数据处理请求对应的自定义拦截器,包括:调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法遍历责任链中的拦截器;获取责任链中的责任与数据库数据处理请求对应的自定义拦截器。

具体地,代理类(Plugin)的触发方法(invoke)是用来判断一个请求是否是一个拦截器的责任的方法。

在实际应用中,(3)在启动MyBatis时,将执行SQL的ResultHandler组件实例化,将自定义的拦截器类对ResultHandler组件的代理对象实例化,并将拦截器存入拦截器链(InterceptorChain)中,这样当一个数据处理请求(查询,删除,更新,新增)请求从服务层送至持久层时,拦截器链会依次遍历所有的拦截器实例(自定义的拦截器的优先级高于原生的拦截器),并判断该请求是否是该拦截器的责任(判断依据是数据操作请求类型是否在拦截器类的Intercepts注解中说明,若有,则该请求是该拦截器的责任。本实施例需要拦截查询请求,那么在Intercepts注解指定了Method为query,那么查询方法就成为了本自定义拦截器的责任)。若不是该拦截器的责任,那么继续调用拦截器链的下一个拦截器,直至找到符合该拦截责任的拦截器。其中,为了提高拦截器的查询效率,可以设置自定义拦截器在责任链中的优先级高于默认拦截器。

具体地,在应用程序在使用MyBatis进行查询操作时,会调用ResultHandler组件的query方法,会触发Java虚拟机(JDK)的动态代理机制,调用代理类(Plugin)的触发方法(invoke),会调用自定义拦截器的intercept方法,进行查询并生成查询结果对象。

上述实施例中,通过插件的方式融入MyBatis的生命周期,将自定义拦截器嵌入原生的拦截器链中,并采用责任链的设计模式,从而可以准确地获取到拦截器。

在其中一个实施例中,具体可以参见图3所示,图3给出了自定义拦截器的嵌入方法,该自定义拦截器的嵌入方法包括:

S302:创建实现了自定义拦截接口的自定义拦截器,并在自定义拦截器的注解中定义自定义拦截器的责任。

具体地,服务器创建自定义拦截器类(MybatisPageableInterceptor),该类实现了MyBatis框架的自定义拦截接口(Interceptor),该类的注解里注明本拦截器将拦截查询结果处理组件(ResultHandler)组件的查询(query)方法。

S304:重写自定义拦截器的拦截方法。

具体地,重写Interceptor接口的自定义拦截方法(intercept),该方法可以是上文提到的主要业务逻辑。

S306:在启动时,将处理结果处理组件进行组件实例化,并将自定义拦截器对处理结果处理组件的代理对象实例化。

S308:将自定义拦截器存入至拦截器链中,拦截器链通过责任链的模型记录了所有拦截器。

具体地,在启动MyBatis时,将执行SQL的ResultHandler组件实例化,将自定义的拦截器类对ResultHandler组件的代理对象实例化,并将拦截器存入拦截器链(InterceptorChain)中,这样在应用程序在使用MyBatis进行查询操作时,会调用ResultHandler组件的query方法,会触发Java虚拟机(JDK)的动态代理机制,调用代理类(Plugin)的触发方法(invoke),会调用自定义拦截器的intercept方法,进行查询并生成查询结果对象。

上述实施例中给出了自定义拦截器的嵌入方法,即将自定义拦截器嵌入MyBatis的方法。

在其中一个实施例中,通过自定义拦截器获取参数集合,包括:通过重写的自定义拦截器的拦截方法,获取代理的处理结果处理组件的代理对象;从代理对象中获取参数集合。

具体地,拦截方法是指在自定义拦截器类MybatisPageableInterceptor中重写的intercept方法,服务器通过该intercept方法获取代理的处理结果处理组件的代理对象,即ResultHandler对象,从而可以从代理对象中获取查询的参数集合。

在其中一个实施例中,从参数集合中获取节点封装对象之前,还包括:判断参数集合中是否包含预设处理参数;当参数集合中包含预设处理参数时,则继续从参数集合中获取节点封装对象;当参数集合中未包含预设处理参数时,则退出自定义拦截器,并通过处理结果处理组件中的预设方法进行数据处理。

具体地,以分页查询为例,预设处理参数可以是指分页定义类的参数,该参数是由软件系统的服务层决定。

在实际应用中,服务器在获取到参数集合后,判断参数集合中是否包含了分页定义类(Pageable)的参数,若包含此参数,则判断该查询为分页查询,获取分页查询对象(pageRequest),继续执行拦截方法;若不包含此参数,则退出拦截方法,执行原本的query方法,即处理结果处理组件中的预设方法进行数据处理。

在其中一个实施例中,查询与节点封装对象对应的原始处理语句之后,还包括:判断缓存中是否存储了与节点封装对象对应的总记录数;若是,则直接从缓存中获取总记录数,否则对原始处理语句进行包装得到用于计算总记录数的总数查询语句;执行总数查询语句得到总记录数;根据数据属性对原始处理语句进行处理得到目标处理语句,包括:根据总记录数以及数据属性对原始处理语句进行处理得到目标处理语句。

其中在实际应用中,从ResultHandler代理对象中获取查询节点的封装对象(MappedStatement)的实例,从节点封装对象中获取原始的待执行SQL,即原始处理语句,这样服务器可以查询原始处理语句对应的总记录数,例如从缓存中查询是否已经记录了该节点对象的查询总记录数,若命中缓存则直接返回缓存中记录的总数。若不存在缓存则继续查询总记录数。将格式化SQL包装成计算总记录数的总数查询SQL,使用JDBC原生的SQL语句执行器(PreparedStatement)执行总数查询SQL,得到查询总数,并将查询总数存入缓存中。其中,包装成计算总记录数的方法是,在原有的查询sql外增加一层总数查询(select 1from (原有sql))。

上述实施例中,以电子购物平台为例,用户使用同一个商品名称,连续点击了两次查询按钮。根据MyBatis架构的二级缓存机制在没有发生数据更新时,同一个查询在失效时间内,会命中缓存。若命中了缓存,则无需再进行查询,返回缓存结果即可,减轻了数据库使用压力。

在其中一个实施例中,查询与节点封装对象对应的原始处理语句之后,还包括:对原始处理语句进行格式化处理。

具体地,格式化具体可以包括:去除两端的空格,并替换掉所有的换行符、制表符,将所有的SQL关键字调整为大写,生成格式化SQL。

这样是为了统一程序开发人员编写在数据库表映射文件(Mapper)的xml格式的文件的格式。由于开发人员可能在编写代码时存在部分不规范的地方,格式化是为了防止执行SQL时发生可能发生的由编写格式而发生的错误。

在其中一个实施例中,根据数据属性对原始处理语句进行处理得到目标处理语句,包括:通过预设的不同数据的类型适配,将数据属性嵌入至原始处理语句中得到目标处理语句。

具体地,本实施例中提供了MySQL、Oracle、PostgreSQL三种关系型数据库,其中适配MySQL、Oracle、PostgreSQL三种关系型数据库的方法:编写数据库方言抽象类(AbstractDialect),并编写三个关系型数据库对应的实现类(MySQLDialect、OracleDialect、PostgreSQLDialect),在实现类中编写该数据库类型对应的分页查询数据库语句的组织方式。在使用本拦截器时,在配置文件中指定好数据库类型,本实施例会自动使用对应的实现类进行分页查询SQL的加工。例如MySQLDialect实现类,使用了MySQL的语法特性,将原有的格式化SQL增加了分页查询内容(原有SQL+限制关键字+起始位置+数据数量)。

在其中一个实施例中,上述的数据库数据处理方法还包括:通过预设追踪工具生成跨度事件,并启动跨度事件;通过跨度事件记录自定义拦截器的每一处理步骤的持续时间;在自定义拦截器处理得到数据处理结果后,保存持续时间至预设追踪工具的日志中,并结束跨度事件。

在程序中继承链路追踪(zipkin)组件,注册程序为zipkin客户端,这样在初始化自定义拦截器类MybatisPageableInterceptor时,注入链路追踪的跟踪者(Tracer)到程序中; 在MybatisPageableInterceptor类的intercept方法开始时,通过Tracer生成一个跨度事件(Span),并启动(start)此Span。

这样在实现数据处理过程中,记录每个过程的开始时刻和结束时刻记录系统时间(System.currentTimeMillis()),通过计算时间差获取每个过程的持续时间。将此持续时间,以及重要的执行信息记录到Span的tag中;在自定义拦截器的intercept方法结束时,关闭(end)此Span。

在其中一个实施例中,上述的数据库数据处理方法还包括:通过预设追踪工具的服务端查询日志,以得到自定义拦截器的每一处理步骤的持续时间。

具体地,在数据处理结束后,可以通过zipkin服务端查看链路追踪结果。

例如,考虑电子购物平台的一个使用场景,用户在查询历史订单时,分页查询耗时为2秒,判断系统反应速度较慢,需要进行性能分析。通过本实施例的性能分析方法,定位一条执行SQL耗时为1.8秒,判断该条SQL为耗时过高的原因。经过分析,该SQL执行的查询对应的数据库表未建立合适的索引,导致耗时较高。该示例可以体现出,本实施例将整体的性能分析细化到分页查询的每个子过程中所带来的优势。

本实施例中集成了链路追踪工具zipkin,在拦截器中实现的关键路径上进行了打点记录,并设置了对应的时间戳记录,支持查看每次分页查询中,内部每个执行过程的耗时,给性能分析提供了便利。

在其中一个实施例中,上述的数据库数据处理方法还包括:预先在数据库中建立数据处理结果存储表;执行目标处理语句得到数据处理结果之后,包括:通过自定义拦截器生成日志插入语句,并执行日志插入语句,以将数据处理结果插入至处理结果存储表中。

具体地,本实施例中涉及的数据库是关系型数据库,关系型数据库:是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。

在关系型数据库中建立一张查询日志表,作为记录查询结果的存储表;该类MybatisPageableInterceptor注解里注明本拦截器将拦截查询结果处理组件(ResultHandler)组件的查询(query)方法;在执行完拦截器intercept方法的主要逻辑后,组装日志SQL。使用JDBC原生的SQL语句执行器(PreparedStatement)执行插入(insert)日志SQL至查询日志表。

其中上述实施例中可调整MybatisPageableInterceptor的拦截方法,推广到更新(update)、删除(delete)、insert等应用场景中,形成一套更完善的DML执行时的嵌入式增强。

例如,考虑电子购物平台的一个使用场景,希望系统可以在用户每次查询的时候自动的在日志表中插入一条查询日志记录。使用本实施例,可以在进行分页查询时,由本实施例指定的拦截器主动的在日志表中插入日志记录,无需再进行额外的编码,减轻了程序员编写代码的负担。

上述实施例中,具备扩展性,实现了对查询过程的嵌入式的增强。其中分页查询拦截器,实际上是对查询(query)的操作的拦截,支持在分页查询时,可以进行扩展,执行额外的DML操作。

具体地,参见图4所示,图4为另一个实施例中的数据库数据处理方法的流程图,在该实施例中:

开发人员在配置文件中配置数据库类型,配置该数据库类型所对应的JDBC驱动包;开发人员编写MyBatis框架中用于执行SQL的映射(Mapper);启动zipkin服务端;启动软件,启动MyBatis,本发明的对应拦截器(以下简称拦截器)将自动实例化,并存入拦截器链;软件在执行分页查询时,被拦截器拦截,并执行拦截器逻辑,获取分页查询结果;软件后端(Java后端服务)将分页查询结果返回给前端(如html、vue等前端技术框架)展示。

具体地,首先程序提交MyBatis查询请求,这样调用ResultHandler的query方法,从而可以调用Plugin的invoke方法以调用自定义拦截器的intercept方法。

然后在MybatisPageableInterceptor类的intercept方法开始时,通过Tracer生成一个跨度事件(Span),并启动(start)此Span。

通过自定义拦截器的intercept方法获取代理对象,并从代理对象中获取参数集合,判断参数集合中是否存在分页参数,若否,则按照原来的处理方法进行处理,若是存在分页参数,则获取节点封装对象,并查询与节点封装对象对应的原始查询语句SQL,格式化原始查询语句SQL,然后判断缓存中是否存在与原始查询语句SQL对应的总记录数,若是,则直接从缓存中读取总记录数,否则包装原始查询语句SQL,得到总记录数查询SQL,并通过该总记录数查询SQL查询总记录数,在获取了总记录数后,则适配数据库类型,并加工形成分页查询SQL,执行该分页查询SQL以获取分页结果,包装分页查询结果为集合,并返回该结果集合,并在处理完成后关闭Span。这样后续可以在分页查询运维调优时,可以定性分析长查询异常出现的原因,可以定量分析长查询异常在执行哪一步子过程时耗时最长。

应该理解的是,虽然图2至图4的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2至图4中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。

在一个实施例中,如图5所示,提供了一种数据库数据处理装置,包括:接收模块100、节点封装对象获取模块200、原始处理语句获取模块300、数据属性获取模块400、目标处理语句生成模块500和数据处理模块600,其中:

接收模块100,用于接收数据库数据处理请求,并获取数据库处理请求对应的自定义拦截器;

节点封装对象获取模块200,用于通过自定义拦截器获取参数集合,并从参数集合中获取节点封装对象;

原始处理语句获取模块300,用于查询与节点封装对象对应的原始处理语句;

数据属性获取模块400,用于从参数集合中获取数据属性;

目标处理语句生成模块500,用于根据数据属性对原始处理语句进行处理得到目标处理语句;

数据处理模块600,用于执行目标处理语句得到数据处理结果。

在其中一个实施例中,上述的接收模块100还用于调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法获取拦截器的责任与数据库数据处理请求对应的自定义拦截器。

在其中一个实施例中,上述的接收模块100包括:

遍历单元,用于调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法遍历责任链中的拦截器;

拦截器获取单元,用于获取责任链中的责任与数据库数据处理请求对应的自定义拦截器。

在其中一个实施例中,上述的数据库数据处理装置还包括:

创建模块,用于创建实现了自定义拦截接口的自定义拦截器,并在自定义拦截器的注解中定义自定义拦截器的责任;

重写模块,用于重写自定义拦截器的拦截方法;

实例化模块,用于在启动时,将处理结果处理组件进行组件实例化,并将自定义拦截器对处理结果处理组件的代理对象实例化;

拦截器存储模块,用于将自定义拦截器存入至拦截器链中,拦截器链通过责任链的模型记录了所有拦截器。

在其中一个实施例中,上述的节点封装对象获取模块200包括:

代理对象获取单元,用于通过重写的自定义拦截器的拦截方法,获取代理的处理结果处理组件的代理对象;

参数集合获取单元,用于从代理对象中获取参数集合。

在其中一个实施例中,上述的数据库数据处理装置还包括:

第一判断模块,用于判断参数集合中是否包含预设处理参数;当参数集合中包含预设处理参数时,则继续从参数集合中获取节点封装对象;当参数集合中未包含预设处理参数时,则退出自定义拦截器,并通过处理结果处理组件中的预设方法进行数据处理。

在其中一个实施例中,上述的数据库数据处理装置还包括:

第二判断模块,用于判断缓存中是否存储了与节点封装对象对应的总记录数;若是,则直接从缓存中获取总记录数,否则对原始处理语句进行包装得到用于计算总记录数的总数查询语句;执行总数查询语句得到总记录数;

目标处理语句生成模块500还用于根据总记录数以及数据属性对原始处理语句进行处理得到目标处理语句。

在其中一个实施例中,上述的数据库数据处理装置还包括:

格式化处理模块,用于对原始处理语句进行格式化处理。

在其中一个实施例中,上述的目标处理语句生成模块500还用于通过预设的不同数据的类型适配,将数据属性嵌入至原始处理语句中得到目标处理语句。

在其中一个实施例中,上述的数据库数据处理装置还包括:

跨度事件生成模块,用于通过预设追踪工具生成跨度事件,并启动跨度事件;

持续时间记录模块,用于通过跨度事件记录自定义拦截器的每一处理步骤的持续时间;

保存模块,用于在自定义拦截器处理得到数据处理结果后,保存持续时间至预设追踪工具的日志中,并结束跨度事件。

在其中一个实施例中,上述的数据库数据处理装置还包括:

持续时间查询模块,用于通过预设追踪工具的服务端查询日志,以得到自定义拦截器的每一处理步骤的持续时间。

在其中一个实施例中,上述的数据库数据处理装置还包括:

预存储模块,用于预先在数据库中建立数据处理结果存储表;

结果存储模块,用于通过自定义拦截器生成日志插入语句,并执行日志插入语句,以将数据处理结果插入至处理结果存储表中。

关于数据库数据处理装置的具体限定可以参见上文中对于数据库数据处理方法的限定,在此不再赘述。上述数据库数据处理装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。

在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图6所示。该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储数据处理结果。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种数据库数据处理方法。

本领域技术人员可以理解,图6中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图6中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现以下步骤:接收数据库数据处理请求,并获取数据库处理请求对应的自定义拦截器;通过自定义拦截器获取参数集合,并从参数集合中获取节点封装对象;查询与节点封装对象对应的原始处理语句;从参数集合中获取数据属性;根据数据属性对原始处理语句进行处理得到目标处理语句;执行目标处理语句得到数据处理结果。

在一个实施例中,处理器执行计算机程序时所实现的获取数据库处理请求对应的自定义拦截器,包括:调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法获取拦截器的责任与数据库数据处理请求对应的自定义拦截器。

在一个实施例中,处理器执行计算机程序时所实现的调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法获取拦截器的责任与数据库数据处理请求对应的自定义拦截器,包括:调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法遍历责任链中的拦截器;获取责任链中的责任与数据库数据处理请求对应的自定义拦截器。

在一个实施例中,处理器执行计算机程序时所实现的自定义拦截器的嵌入方法包括:创建实现了自定义拦截接口的自定义拦截器,并在自定义拦截器的注解中定义自定义拦截器的责任;重写自定义拦截器的拦截方法;在启动时,将处理结果处理组件进行组件实例化,并将自定义拦截器对处理结果处理组件的代理对象实例化;将自定义拦截器存入至拦截器链中,拦截器链通过责任链的模型记录了所有拦截器。

在一个实施例中,处理器执行计算机程序时所实现的通过自定义拦截器获取参数集合,包括:通过重写的自定义拦截器的拦截方法,获取代理的处理结果处理组件的代理对象;从代理对象中获取参数集合。

在一个实施例中,处理器执行计算机程序时所实现的从参数集合中获取节点封装对象之前,还包括:判断参数集合中是否包含预设处理参数;当参数集合中包含预设处理参数时,则继续从参数集合中获取节点封装对象;当参数集合中未包含预设处理参数时,则退出自定义拦截器,并通过处理结果处理组件中的预设方法进行数据处理。

在一个实施例中,处理器执行计算机程序时所实现的查询与节点封装对象对应的原始处理语句之后,还包括:判断缓存中是否存储了与节点封装对象对应的总记录数;若是,则直接从缓存中获取总记录数,否则对原始处理语句进行包装得到用于计算总记录数的总数查询语句;执行总数查询语句得到总记录数;处理器执行计算机程序时所实现的根据数据属性对原始处理语句进行处理得到目标处理语句,包括:根据总记录数以及数据属性对原始处理语句进行处理得到目标处理语句。

在一个实施例中,处理器执行计算机程序时所实现的查询与节点封装对象对应的原始处理语句之后,还包括:对原始处理语句进行格式化处理。

在一个实施例中,处理器执行计算机程序时所实现的根据数据属性对原始处理语句进行处理得到目标处理语句,包括:通过预设的不同数据的类型适配,将数据属性嵌入至原始处理语句中得到目标处理语句。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:通过预设追踪工具生成跨度事件,并启动跨度事件;通过跨度事件记录自定义拦截器的每一处理步骤的持续时间;在自定义拦截器处理得到数据处理结果后,保存持续时间至预设追踪工具的日志中,并结束跨度事件。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:通过预设追踪工具的服务端查询日志,以得到自定义拦截器的每一处理步骤的持续时间。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:预先在数据库中建立数据处理结果存储表;处理器执行计算机程序时所实现的执行目标处理语句得到数据处理结果之后,包括:通过自定义拦截器生成日志插入语句,并执行日志插入语句,以将数据处理结果插入至处理结果存储表中。

在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:接收数据库数据处理请求,并获取数据库处理请求对应的自定义拦截器;通过自定义拦截器获取参数集合,并从参数集合中获取节点封装对象;查询与节点封装对象对应的原始处理语句;从参数集合中获取数据属性;根据数据属性对原始处理语句进行处理得到目标处理语句;执行目标处理语句得到数据处理结果。

在一个实施例中,计算机程序被处理器执行时所实现的获取数据库处理请求对应的自定义拦截器,包括:调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法获取拦截器的责任与数据库数据处理请求对应的自定义拦截器。

在一个实施例中,计算机程序被处理器执行时所实现的调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法获取拦截器的责任与数据库数据处理请求对应的自定义拦截器,包括:调用处理结果处理组件的处理方法,以触发动态代理机制调用预设触发方法遍历责任链中的拦截器;获取责任链中的责任与数据库数据处理请求对应的自定义拦截器。

在一个实施例中,计算机程序被处理器执行时所实现的自定义拦截器的嵌入方法包括:创建实现了自定义拦截接口的自定义拦截器,并在自定义拦截器的注解中定义自定义拦截器的责任;重写自定义拦截器的拦截方法;在启动时,将处理结果处理组件进行组件实例化,并将自定义拦截器对处理结果处理组件的代理对象实例化;将自定义拦截器存入至拦截器链中,拦截器链通过责任链的模型记录了所有拦截器。

在一个实施例中,计算机程序被处理器执行时所实现的通过自定义拦截器获取参数集合,包括:通过重写的自定义拦截器的拦截方法,获取代理的处理结果处理组件的代理对象;从代理对象中获取参数集合。

在一个实施例中,计算机程序被处理器执行时所实现的从参数集合中获取节点封装对象之前,还包括:判断参数集合中是否包含预设处理参数;当参数集合中包含预设处理参数时,则继续从参数集合中获取节点封装对象;当参数集合中未包含预设处理参数时,则退出自定义拦截器,并通过处理结果处理组件中的预设方法进行数据处理。

在一个实施例中,计算机程序被处理器执行时所实现的查询与节点封装对象对应的原始处理语句之后,还包括:判断缓存中是否存储了与节点封装对象对应的总记录数;若是,则直接从缓存中获取总记录数,否则对原始处理语句进行包装得到用于计算总记录数的总数查询语句;执行总数查询语句得到总记录数;计算机程序被处理器执行时所实现的根据数据属性对原始处理语句进行处理得到目标处理语句,包括:根据总记录数以及数据属性对原始处理语句进行处理得到目标处理语句。

在一个实施例中,计算机程序被处理器执行时所实现的查询与节点封装对象对应的原始处理语句之后,还包括:对原始处理语句进行格式化处理。

在一个实施例中,计算机程序被处理器执行时所实现的根据数据属性对原始处理语句进行处理得到目标处理语句,包括:通过预设的不同数据的类型适配,将数据属性嵌入至原始处理语句中得到目标处理语句。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:通过预设追踪工具生成跨度事件,并启动跨度事件;通过跨度事件记录自定义拦截器的每一处理步骤的持续时间;在自定义拦截器处理得到数据处理结果后,保存持续时间至预设追踪工具的日志中,并结束跨度事件。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:通过预设追踪工具的服务端查询日志,以得到自定义拦截器的每一处理步骤的持续时间。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:预先在数据库中建立数据处理结果存储表;计算机程序被处理器执行时所实现的执行目标处理语句得到数据处理结果之后,包括:通过自定义拦截器生成日志插入语句,并执行日志插入语句,以将数据处理结果插入至处理结果存储表中。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-Only Memory,ROM)、磁带、软盘、闪存或光存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓存存储器。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic Random Access Memory,DRAM)等。

以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号