数据查询方法、装置、计算机设备及存储介质与流程

文档序号:17926224发布日期:2019-06-15 00:25阅读:149来源:国知局
数据查询方法、装置、计算机设备及存储介质与流程

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



背景技术:

终端中操作系统的上层应用的开发是基于java完成的,但是java是平台无关的,因此有些底层的任务用java实现起来并不容易,例如,当涉及本地服务、连接库或硬件驱动等方面的任务时,通常需要运行c程序来实现。为了进行区分,将操作系统中基于java完成的上层称为“java层”,将基于c程序完成的底层称为“native层”。java层和native层由于是基于不同语言开发的,所以两者之间的通信需要通过接口进行互相调用才能实现。

传统的操作系统中的上层(即java层)应用需要进行数据查询时,需要先将查询到的数据存储到native层的系统缓存区中,然后从系统缓存区中获取对应的数据。但是由于native系统缓存区的存储空间往往比较小,当数据量比较大时,系统缓存区就限制了读取数据的效率,使得查询时间较长,查询效率低。



技术实现要素:

基于此,有必要针对上述问题,提出了一种可以节省时间,提高查询效率的数据查询方法、装置、计算机设备及存储介质。

一种数据查询方法,所述方法包括:

获取数据查询请求,所述数据查询请求是由java层发起的;

根据所述数据查询请求中包含的查询条件在数据库中查找得到与所述查询条件匹配的目标数据;

将所述目标数据缓存到native层中的数据动态缓存区中,获取所述目标数据在所述数据动态缓存区中的存储地址,为所述存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层中的系统缓存区;

从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据动态缓存区中提取相应的目标查询数据返回给java层。

一种数据查询装置,所述装置包括:

请求获取模块,用于获取数据查询请求,所述数据查询请求是由java层发起的;

查找模块,用于根据所述数据查询请求中包含的查询条件在数据库中查找得到与所述查询条件匹配的目标数据;

存储模块,用于将所述目标数据缓存到native层中的数据动态缓存区中,获取所述目标数据在所述数据动态缓存区中的存储地址,为所述存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层中的系统缓存区;

返回模块,用于从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据动态缓存区中提取相应的目标查询数据返回给java层。

在其中一个实施例中,所述装置还包括:创建模块,用于当所述native层中不存在与所述数据查询请求对应的数据动态缓存区和系统缓存区时,在所述native层中创建与所述数据查询请求对应的数据动态缓存区和系统缓存区。

在其中一个实施例中,所述装置还包括:更新提取模块,用于获取数据更新请求,根据所述数据更新请求中包含的更新索引值从所述数据动态缓存区中提取与所述更新索引值相应的目标查询数据。

在其中一个实施例中,所述存储模块还用于读取存储在数据库中的目标数据,所述目标数据是以行为单位存储在数据库中的,其中,每一行的目标数据包含有多个列,以行为最小存储单位将每一行的目标数据存储到所述数据动态缓存区,其中,根据每一行中每一列对应的数据类型为所述每一列中的数据动态分配内存进行存储。

在其中一个实施例中,所述装置还包括:第一判断模块,用于当所述目标数据的数据量大于预设阈值时,则通知存储模块将所述目标数据缓存到native层中的数据动态缓存区中。

在其中一个实施例中,所述装置还包括:第二判断模块,用于获取与所述查询条件对应的业务标识,当所述业务标识为第一类业务标识时,则通知存储模块将所述目标数据缓存到native层中的数据动态缓存区中。

在其中一个实施例中,所述第一判断模块还用于当所述目标数据的数据量小于或等于预设阈值时,则将目标数据缓存到native层中的系统缓存区,从所述系统缓存区中提取相应的目标数据返回给java层;所述第二判断模块还用于当所述业务标识为第二类业务标识时,则将目标数据缓存到native层中的系统缓存区,从所述系统缓存区中提取相应的目标数据返回给java层。

在其中一个实施例中,所述装置还包括:数据库更新模块,用于接收数据变更请求,根据所述数据变更请求在所述数据库中变更相应的数据;数据动态缓存区更新模块,用于当数据库中数据变更完毕后,更新所述数据动态缓存区中的相应的数据;系统缓存区更新模块,用于当数据变更的类型为增加或删除时,则在系统缓存区相应地增加或删除索引项,生成新的索引关系;重新获取模块,用于当新的所述索引关系生成后,通知所述java层重新从所述数据动态缓存区中获取相应的目标数据。

在其中一个实施例中,所述系统缓存区和所述数据动态缓存区存储在native层的匿名共享内存中。

一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行以下步骤:

获取数据查询请求,所述数据查询请求是由java层发起的;

根据所述数据查询请求中包含的查询条件在数据库中查找得到与所述查询条件匹配的目标数据;

将所述目标数据缓存到native层中的数据动态缓存区中,获取所述目标数据在所述数据动态缓存区中的存储地址,为所述存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层中的系统缓存区;

从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据动态缓存区中提取相应的目标查询数据返回给java层。

一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行以下步骤:

获取数据查询请求,所述数据查询请求是由java层发起的;

根据所述数据查询请求中包含的查询条件在数据库中查找得到与所述查询条件匹配的目标数据;

将所述目标数据缓存到native层中的数据动态缓存区中,获取所述目标数据在所述数据动态缓存区中的存储地址,为所述存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层中的系统缓存区;

从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据动态缓存区中提取相应的目标查询数据返回给java层。

上述数据查询方法、装置、计算机设备及存储介质,获取到上层应用发起的数据查询请求后,首先根据数据查询请求中的包含的查询条件在数据库中查找得到与查询条件匹配的目标数据,然后将目标数据缓存到native层中的数据动态缓存区中,获取目标数据在数据动态缓存区中的存储地址,为存储地址分配对应的索引值,之后根据索引值与对应的存储地址生成索引关系,将索引关系存储在native层中的系统缓存区,然后从系统缓存区获取索引关系,根据索引关系从数据动态缓存区中提取相应的目标查询数据返回给java层。上述数据查询方法中通过将数据和索引分离的方式,将索引存储在系统缓存区,将数据缓存到native层的数据动态缓存区,由于native层的数据动态缓存区的内存不受限制,所以可以一次性地将目标数据缓存到数据动态缓存区,相对于传统的需要多次从数据库中读取数据的方式,该方法大大提高了查询的速度。

一种数据查询方法,所述方法包括:

获取数据查询请求,所述数据查询请求是由java层发起的;

根据所述数据查询请求中包含的查询条件在数据库中查找与所述查询条件匹配的目标数据;

获取所述目标数据在所述数据库中的存储地址,为所述存储地址分配对应的索引值,根据所述索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层的系统缓存区;

从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据库中提取相应的目标查询数据返回给java层。

一种数据查询装置,所述装置包括:

查询请求获取模块,用于获取数据查询请求,所述数据查询请求是由java层发起的;

目标数据查找模块,根据所述数据查询请求中包含的查询条件在数据库中查找与所述查询条件匹配的目标数据;

索引关系存储模块,用于获取所述目标数据在所述数据库中的存储地址,为所述存储地址分配对应的索引值,根据所述索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层的系统缓存区;

数据返回模块,用于从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据库中提取相应的目标查询数据返回给java层。

一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行以下步骤:

获取数据查询请求,所述数据查询请求是由java层发起的;

根据所述数据查询请求中包含的查询条件在数据库中查找与所述查询条件匹配的目标数据;

获取所述目标数据在所述数据库中的存储地址,为所述存储地址分配对应的索引值,根据所述索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层的系统缓存区;

从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据库中提取相应的目标查询数据返回给java层。

一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行以下步骤:

获取数据查询请求,所述数据查询请求是由java层发起的;

根据所述数据查询请求中包含的查询条件在数据库中查找与所述查询条件匹配的目标数据;

获取所述目标数据在所述数据库中的存储地址,为所述存储地址分配对应的索引值,根据所述索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层的系统缓存区;

从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据库中提取相应的目标查询数据返回给java层。

上述数据查询方法、装置、计算机设备及存储介质,获取到上层应用发起的数据查询请求后,首先根据数据查询请求中的包含的查询条件在数据库中查找得到与查询条件匹配的目标数据,然后获取目标数据在数据库中的存储地址,为存储地址分配对应的索引值,之后根据索引值与对应的存储地址生成索引关系,将索引关系存储在native层中的系统缓存区,然后从系统缓存区获取索引关系,根据索引关系从数据库中提取相应的目标查询数据返回给java层。上述数据查询方法通过获取目标数据在数据库中的存储地址,然后为存储地址分配索引值,根据索引值和对应的存储地址生成索引关系,将索引关系存储在系统缓存区,通过索引关系可以直接从数据库获取目标数据,既提高了查询速度,又不需要额外地占用内存。

附图说明

图1为一个实施例中数据查询方法的架构图;

图2为一个实施例中数据查询方法的流程图;

图3为一个实施例中将目标数据缓存到native层中的数据动态缓存区中的方法流程图;

图4为一个实施例中数据动态缓存区中的数据结构的示意图;

图5为另一个实施例中数据查询方法的流程图;

图6为又一个实施例中数据查询方法的流程图;

图7为一个实施例中数据变更的流程示意图;

图8为再一个实施例中数据查询方法的流程图;

图9为还一个实施例中数据查询方法的流程图;

图10为一个实施例中数据查询装置的结构框图;

图11为另一个实施例中数据查询装置的结构框图;

图12为又一个实施例中数据查询装置的结构框图;

图13为再一个实施例中数据查询装置的结构框图;

图14为还一个实施例中数据查询装置的结构框图;

图15为一个实施例中计算机设备的结构框图。

具体实施方式

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

图1为一个实施例中数据查询方法的架构图。参考图1,在终端操作系统中分为了两层,一个是java层,其中,上层应用存在于java层。另一个是native层。其中,由于java层与native层是基于不同编程语言开发的,所以java层与native层之间不能直接互相调用,需要通过开发的接口进行互相调用。而接口会相应地设置接口参数,使得通过接口只能直接访问某个位置的数据。比如,一般将native层的系统缓存区作为java层通过接口可以直接访问的内存。由于系统缓存区的内存往往比较小,为了提高数据的查询速度,在native层增加了数据动态缓存区,首先将在数据库中读取到的目标数据缓存到数据动态缓存区,然后获取目标数据在数据动态缓存区中的存储地址,为存储地址分配对应的索引值,然后根据索引值和对应的存储地址生成索引关系,将索引关系存储在native层中的系统缓存区,这样上层应用就可以通过java层和native层之间的调用接口获取系统缓存区中的索引关系,然后根据索引关系从数据动态缓存区中提取相应的目标查询数据返回给java层。

如图2所示,在一个实施例中,提供了一种数据查询方法。本实施例主要以该方法应用于安装android系统的终端举例说明。参照图2,该数据查询方法具体包括如下步骤:

步骤s202,获取数据查询请求,数据查询请求是由java层发起的。

其中,操作系统(比如,android系统)中的上层应用的开发是基于java完成的,所以称为“java层”。但是由于java是平台无关的,因此有些底层的任务用java实现起来并不容易,例如,当涉及本地服务、连接库或硬件驱动等方面的任务时,通常需要运行c程序来实现,而c程序运行在native(本地方法)层,所以将相应的需要用c程序来实现的底层称为“native层”。由于java层和native层对应的开发语言不同,所以两者需要通过接口进行调用来访问对方。由于数据是存储在数据库中的,而数据库是与native层直接关联的,所以在查询数据时,首先需要将数据库中的数据读取到native层中,然后通过接口调用的方式将native层中的数据返回给java层。具体地,当上层应用需要查询数据时,发起数据查询请求,即数据查询请求是由java层发起的。

步骤s204,根据数据查询请求中包含的查询条件在数据库中查找得到与查询条件匹配的目标数据。

其中,由于数据是存储在数据库中,即是存储在数据库文件中的。所以当接收到数据查询请求后,将数据查询请求发送给数据库,数据库接收到数据查询请求后,根据数据查询请求中包含的查询条件从数据库中查找得到与查询条件匹配的目标结果集。目标结果集中包含了与查询条件匹配的所有目标数据。查询条件是指用来获取目标数据的条件,其中,查询条件可以是关键字,也可以是日期等。具体地,终端中的数据库一般采用的是sqlite数据库,其中,sqlite是一款轻型的数据库,是遵守acid的关系型数据库关系系统,它包含在一个相对小的c库中。为了便于理解,可以将数据库理解为是处于native层中的。

步骤s206,将目标数据缓存到native层中的数据动态缓存区中,获取目标数据在数据动态缓存区中的存储地址,为存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,将索引关系存储在native层中的系统缓存区。

其中,数据动态缓存区是指在native层中分配的用于存储数据的内存,由于数据库是与native层直接关联的,所以当在数据库中查找到目标数据后,首先将目标数据缓存到native层中的数据动态缓存区中。具体地,可以通过输入输出i/o操作从数据库中获取到目标数据缓存到native层中的数据动态缓存区中。将目标数据缓存到native层中的动态缓存区后,获取目标数据在动态缓存区中的存储地址,然后为存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,然后将索引关系存储到native层中的系统缓存区,在一个实施例中,在一个实施例中,是以key-value(键-值)的方式存储到系统缓存区的。其中,系统缓存区是指系统分配的用于存储数据的内存,系统缓存区中的数据是java层通过接口可以直接访问的数据。系统缓存区的内存的大小是预先设置的,一般比较小,android.4x版本以后的也只有2mb,之前的版本仅有1mb。

传统的数据查询方法,是将查询到的目标数据直接缓存到系统缓存区中,然后将系统缓存区的目标数据返回给java层。由于系统缓存区的内存比较小,当查询到的数据量比较大时,需要多次访问数据库进行分批读取,当读取下一批的时候需要首先清空系统缓存区。在查询到的目标数据的数据量比较大时,通过多次访问数据库,不仅增加了数据库的压力,而且导致查询的时间增长,随着数据量的增大,查询时间会呈现指数级增长。

由于native层中的内存的分配基本不受限制,所以通过在native层中创建数据动态缓存区,不仅可以一次性地将查询到的目标数据全部缓存到native层中的数据动态缓存区中,而且避免了数据溢出的风险。将目标数据缓存到native层中的动态缓存区后,获取目标数据在动态缓存区中的存储地址,然后为存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,然后将索引关系存储到native层中的系统缓存区。系统缓存区是java层通过接口可以直接调用的内存,所以java层获取系统缓存区中的索引关系,便于后续根据索引关系获取数据动态缓存区中的目标数据。通过将索引和数据分离,直接占用内存很小的索引关系存放到系统缓存区,提高了数据查询的速度,且大大减少了数据库的压力,且由于native层中的内存的分配基本不受限制,减少了内存溢出的风险。

步骤s208,从系统缓存区获取索引关系,根据索引关系从数据动态缓存区中提取相应的目标查询数据返回给java层。

其中,将生成的索引关系存储到native层中的系统缓存区后,根据索引关系从数据动态缓存区中提取相应的目标查询数据,返回将目标查询数据返回给java层的上层应用。由于java层根据索引关系从数据动态缓存区中提取目标数据的时候不一定是一次性地将所有目标数据都返回给上层应用,所以为了区分,将返回给上层应用的数据称为“目标查询数据”。在一个实施例中,可以一次性地将数据动态缓存区中的所有目标数据都返回给上层应用。在另一个实施例中,由于显示界面的限制,可以分批次地从数据动态缓存区中提取相应的目标查询数据,通过分批次读取可以节省在java层的存储空间。

具体地,java层是通过游标(cursor)来从native层获取数据的,当上层应用通过游标获取数据时,先是从系统缓存区获取目标数据的内存地址,然后根据内存地址从数据动态缓存区中获取数据内容并返回,数据返回后可以将数据展示在用户界面或者另行操作。其中,游标(cursor)是处理数据的一种方法,为了查看或处理结果集中的数据,游标提供了在结果集中一次一行或多行前进或向后浏览数据的能力,可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。

上述数据查询方法,获取到上层应用发起的数据查询请求后,首先根据数据查询请求中的包含的查询条件在数据库中查找得到与查询条件匹配的目标数据,然后将目标数据缓存到native层中的数据动态缓存区中,获取目标数据在数据动态缓存区中的存储地址,为存储地址分配对应的索引值,之后根据索引值与对应的存储地址生成索引关系,将索引关系存储在native层中的系统缓存区,然后从系统缓存区获取索引关系,根据索引关系从数据动态缓存区中提取相应的目标查询数据返回给java层。上述数据查询方法中通过将数据和索引分离的方式,将索引存储在系统缓存区,将数据缓存到native层的数据动态缓存区,由于native层的数据动态缓存区的内存不受限制,所以可以一次性地将目标数据缓存到数据动态缓存区,相对于传统的需要多次从数据库中读取数据的方式,该方法大大提高了查询的速度。

在一个实施例中,在获取数据查询请求,数据查询请求是由java层发起的步骤之后还包括:当native层中不存在与数据查询请求对应的数据动态缓存区和系统缓存区时,在native层中创建与数据查询请求对应的数据动态缓存区和系统缓存区。

其中,获取到数据查询请求后,首先判断native层中是否存在与该数据查询请求对应的数据动态缓存和系统缓存区,如果有,则进入将目标数据缓存到native层中的数据动态缓存区中的步骤。如果没有,则需要在native层中动态创建与数据查询请求对应的数据动态缓存区和系统缓存区。在一个实施例中,还需要获取目标数据的数据量,根据目标数据的数据量动态创建数据动态缓存区。具体地,根据目标数据的数据量的大小为目标数据在native层分配内存。比如,假设目标数据的数据量为10mb,那么在native层中分配大于或等于10mb的内存用于存储目标数据。系统缓存区的大小是受系统限制的,系统缓存区的内存大小是预先设置的固定大小。

当数据查询请求结束时,则相应地释放与该数据查询请求对应的数据动态缓存区和系统缓存区。数据动态缓存区和系统缓存区是与查询请求对应的,当同时有多个不同的查询请求时,分别创建与每个查询请求对应的数据动态缓存区和系统缓存区。举个例子,假设有a和b两个查询请求,其中,a对应一个数据动态缓存区1和系统缓存区1,b对应一个数据动态缓存区2和系统缓存区2。

在一个实施例中,上述数据查询方法还包括:获取数据更新请求,根据所述数据更新请求的更新索引值从所述数据动态缓存区中提取与所述更新索引值相应的目标查询数据。

其中,数据更新请求是指在数据查询请求的过程中发起的请求,当数据动态缓存区中的数据量比较大时,可以分多次从数据动态缓存区中读取目标查询数据。举个例子,假设数据动态缓存区中有100条数据,但是由于界面展示的内容有限,为了节省java层的内存空间,每次可以只读取10条数据进行显示,当用户拖动滚动条查询后面的数据时,就相当于发起了数据更新请求,该数据更新请求中包含了要查找的数据所对应的索引值,称为“更新索引值”,更新索引值用于从索引关系中获取对应的存储地址,然后根据存储地址从数据动态缓存区中提取与更新索引值相应的目标查询数据。举个例子,在数据动态缓存中存储了100条目标数据,即存储了索引值1-100分别对应的存储地址,由于显示界面的限制,第一次只返回了10条数据到上层应用,如果根据这10条数据已经得到了想要的信息,不需要再浏览剩下的,可以结束本次查询。由于只读取了10条到java层,所以大大节省了java的存储空间。如果根据这10条数据没有得到相应的信息,可以发起数据更新请求,数据更新请求中包含有更新索引值,比如,假设上次查看的数据索引值对应的为1-10,那么本次更新时,可以将更新索引值设为11,即从索引值为11的地方开始查询数据,当然,中间也可以跳过一部分索引值,比如,也可以直接从索引值为19的地方开始查询数据,其中,更新索引值是根据用户的操作自动获取的,不需要认为输入,最后将查询到的目标查询数据返回给上层应用。其中,数据更新请求可以通过拖动滚动条生成,也可以通过点击更新键等方式来生成。

如图3所示,在一个实施例中,所述将所述目标数据缓存到native层中的数据动态缓存区中的步骤s206包括:

步骤s206a,读取存储在数据库中的目标数据,目标数据是以行为单位存储在数据库中的,其中,每一行的目标数据包含有多个列。

其中,数据库中的存储数据是以行为单位进行存储的。每一行数据相当于一条数据记录。而每一行的目标数据中包含有多个列。从数据库中提取目标数据时,也是以行为单位进行提取的,一行中包含有多个列。

步骤s206b,以行为最小存储单位将每一行的目标数据存储到所述数据动态缓存区,其中,根据每一行中每一列对应的数据类型为所述每一列中的数据动态分配内存进行存储。

其中,由于需要将目标数据缓存到数据动态缓存区,为了便于存储,在数据动态缓存区中是以行为最小存储单位来存储从数据库中提取的每一行的目标数据的。同样地,在数据动态缓存区中,每一行中也包含有多个列,在数据存储的过程中,是根据每一列对应的数据类型为每一列中的数据动态分配内存进行存储的。举个例子,假设数据类型为int型,则分配4个字节(bit)用于存储相应的数据。如图4所示,为一个实施例中,数据动态缓存区中的数据结构的示意图。其中,将行数据作为最小存储单位,在行数据中维护了一个数据列表,数据列表中包含有多个列,每个列中都维护有数据的大小、类型以及数值。该数据结构支持int,long,float,double,string以及blob等数据格式,涵盖了数据库所有的数据类型。

如图5所示,在一个实施例中,在所述根据所述数据查询请求中包含的查询条件在数据库中查找与所述查询条件匹配的目标数据的步骤之后还包括:

步骤s205,判断目标数据的数据量是否大于预设阈值,若是,则进入步骤s206,若否,则进入步骤s207。

其中,查询到目标数据后,判断目标数据的数据量是否大于预设阈值,若是,则进入将目标数据缓存到native层中的数据动态缓存区中步骤,若否,则将目标数据缓存到native层中的系统缓存区中,然后从系统缓存区中提取相应的目标数据返回给java层。由于本申请提出的数据查询方法虽然提高了查询速度,但是消耗了native层中的内存,原始的方法虽然查询速度慢,但是节省了内存的占用。当数据量比较少时,可以采用原始的方法,当数据量比较多时,则采用本申请的方法,通过将两种方法进行了封装,可以将两种查询方法有效地结合起来,不但可以提高查询速度,而且可以节省内存占用。

步骤s207,将目标数据缓存到native层中的系统缓存区,从所述系统缓存区中提取相应的目标数据返回给java层。

其中,当目标数据的数据量不大于预设阈值时,将目标数据直接缓存到native层中的系统缓存区即可,从系统缓存区中提取相应的目标数据返回给java层。当目标数据的数据量比较小时,直接将目标数据缓存到native层中的系统缓存区有利于减少内存的占用。

如图6所示,在一个实施例中,在将所述目标数据缓存到native层中的数据动态缓存区中的步骤之前还包括:

步骤203,获取与所述查询条件对应的业务标识,当所述业务标识为第一类业务标识时,则进入步骤s206,当业务标识为第二类业务标识时,则进入步骤s207。

其中,不同业务对数据查询的速度要求不同,可以预先将那些对实时性要求高的业务所对应的业务标识作为第一类业务标识,将实时性要求不高的业务所对应的业务标识作为第二类业务标识。其中,查询条件中包含有相应的业务信息,获取与查询条件对应的业务标识,若业务标识为第一类业务标识,则进入将目标数据缓存到native层中的数据动态缓存区中步骤,若业务标识为第二类业务标识,则将目标数据缓存到native层中的系统缓存区中,然后从系统缓存区中提取相应的目标数据返回给java层。通过预先根据业务对实时性的要求将业务划分为两类,对于实时性要求高的采用快速查询的方法,对于实时性要求不高的可以采用原始查询方法,通过两者结合,有利于既能保证业务的需求,又能尽量地减少内存的占用。

在一个实施例中,上述数据查询方法还包括:接收数据变更请求,根据数据变更请求在所述数据库中变更相应的数据,当数据库中数据变更完毕后,更新所述数据动态缓存区中的相应的数据,当数据变更的类型为增加或删除时,则相应地增加或删除索引项,生成新的索引关系,当新的所述索引关系生成后,通知所述java层重新从所述数据动态缓存区中获取相应的目标数据。

其中,数据变更类型包括增加、删除和修改。如图7所示,在数据查询的过程中,接收到后台发送的数据变更的请求后,首先,终端中的数据处理模块首先根据数据变更请求在数据库中变更相应的数据,当数据库中变更成功后,再更新数据动态缓存区中相应的数据,当数据变更的类型为修改时,则不需要修改索引关系,如果数据变更类型为增加或删除,则需要相应地增加或删除索引项,生成新的索引关系,当新的索引关系生成后,将新的索引关系返回给java层,通知java层重新进行数据查询,然后根据新的索引关系从数据动态缓存区中获取相应的目标数据。如果数据变更类型为修改,则不需要修改索引关系,直接从数据动态缓存区获取相应的目标数据。在数据发生变更的情况下,尤其是在数据变更比较频繁的情况下,不需要重新查询数据库,只需要从数据动态缓存区就可以获取到更新后的数据,大大减少了数据库的压力。

在一个实施例中,所述系统缓存区和所述数据动态缓存区存储在native层的匿名共享内存中。

其中,将系统缓存区和数据动态缓存区都存储在匿名共享内存中,即将索引关系和目标数据都存储在匿名共享内存中,支持跨进程数据查询。在android系统中,提供了独特的匿名共享内存子系统ashmen(anonymoussharedmemory,匿名共享内存),它以驱动程序的形式实现在内核空间中,它有两个特点,一是能够辅助内存管理来有效管理不再使用的内存,二是它通过binder进程间通信机制来实现进程间的内存共享。

如图8所示,在一个实施例中,提出了一种数据查询方法,该方法包括:

步骤s801,获取数据查询请求,数据查询请求是由java层发起的。

步骤s802,根据数据查询请求中包含的查询条件在数据库中查找得到与查询条件匹配的目标数据。

步骤s803,判断目标数据的数据量是否大于预设阈值,若是,则进入步骤s804,若否,则记入步骤s808。

步骤s804,判断native层中是否存在与数据查询请求对应的数据动态缓存区和系统缓存区,若否,则进入步骤s805,若是,则进入步骤s806。

步骤s805,在native层中创建与数据查询请求对应的数据动态缓存区和系统缓存区。

步骤s806,将目标数据缓存到native层中的数据动态缓存区中,获取目标数据在数据动态缓存区中的存储地址,为存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,将索引关系存储在native层中的系统缓存区;

步骤s807,从系统缓存区获取索引关系,根据索引关系从数据动态缓存区中提取相应的目标查询数据返回给java层。

步骤s808,将目标数据缓存到系统动态缓存区,从系统缓存区中提取相应的目标数据返回给java层。

如图9所示,在一个实施例中,提出了一种数据查询方法,该方法包括:

步骤s902,获取数据查询请求,数据查询请求是由java层发起的。

具体地,当用户需要查询数据时,通过操作上层应用发起数据查询请求,终端获取数据查询请求,该数据查询请求是由上层应用即java层发起的。

步骤s904,根据数据查询请求中包含的查询条件在数据库中查找与查询条件匹配的目标数据。

其中,由于数据是存储在数据库中,即是存储在数据库文件中的。所以当接收到数据查询请求后,将数据查询请求发送给数据库,数据库接收到数据查询请求后,根据数据查询请求中包含查询条件从数据库中查找得到与查询条件匹配的目标结果集。目标结果集中包含了与查询条件匹配的所有目标数据。查询条件是指用来获取目标数据的条件,其中,查询条件可以是关键字,也可以是日期等查询条件。

步骤s906,获取目标数据在数据库中的存储地址,为存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,将索引关系存储在native层的系统缓存区。

其中,当在数据库中查找到与查询条件匹配的目标数据后,直接获取目标数据在数据库中的存储地址,然后为存储地址分配索引值,然后将索引值与目标数据在数据库中的存储地址进行关联,生成索引关系,其中,索引值用于后续的索引查询,防止重复读取数据。将索引关系存储到native层的系统缓存区。系统缓存区是java层通过接口可以直接读取到的native中的内存。

步骤s908,从系统缓存区获取索引关系,根据索引关系从数据库中提取相应的目标查询数据返回给java层。

其中,将生成的索引关系存储到native层中的系统缓存区后,根据索引关系从数据库中提取相应的目标查询数据,将目标查询数据返回给java层的上层应用。由于java层根据索引关系从数据库中提取目标数据的时候不一定是一次性地将所有目标数据都返回给上层应用,所以为了区分,将返回给上层应用的数据称为“目标查询数据”。在一个实施例中,可以一次性地从数据库中的所有目标数据都返回给上层应用。在另一个实施例中,由于显示界面的限制,可以分批次地从数据库中提取相应的目标查询数据,通过分批次读取可以节省在java层的存储空间。该数据查询方法中,直接获取到的目标数据在数据库中的存储地址,然后为存储地址分配索引值,根据索引值和存储地址之间的关系生成索引关系,将索引关系存储到系统缓存区,在这个过程中,不仅可以快速地查询数据,而且也不用额外在native层中占用空间。而且在后续数据变更时,也只需要修改数据库中的数据,大大节省了更改数据的时间。

上述数据查询方法,获取到上层应用发起的数据查询请求后,首先根据数据查询请求中的包含的查询条件在数据库中查找得到与查询条件匹配的目标数据,然后获取目标数据在数据库中的存储地址,为存储地址分配对应的索引值,之后根据索引值与对应的存储地址生成索引关系,将索引关系存储在native层中的系统缓存区,然后从系统缓存区获取索引关系,根据索引关系从数据库中提取相应的目标查询数据返回给java层。上述数据查询方法通过获取目标数据在数据库中的存储地址,然后为存储地址分配索引值,根据索引值和对应的存储地址生成索引关系,将索引关系存储在系统缓存区,通过索引关系可以直接从数据库获取目标数据,既提高了查询速度,又不需要额外地占用内存。

在一个企业即时通信的应用场景中,企业即时通信服务主要聚焦于提供公司内部交流、办公服务,对外营销等功能,部分企业拥有大量的员工,所以企业即时通信需要可以支撑较大数据的能力。而企业即时通信app是按照在移动终端的,为了能够满足移动终端可以快速地查询数据量比较大的数据库,并且可以快速地展示数据,当企业用户通过企业即时通信app查询到的目标数据的数据量比较大时,则在native层中创建数据动态缓存区,将在数据库中查找到的目标数据缓存到数据动态缓存区,然后获取目标数据在数据动态缓存区中的存储地址,为存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,将索引关系存储到系统缓存区,然后根据系统缓存区中的索引关系从数据动态缓存区中提取相应的目标查询数据,可以实现快速查询数据进行展示的目的。

如图10所示,在一个实施例中,提出了一种数据查询装置,该装置包括:

请求获取模块1002,用于获取数据查询请求,所述数据查询请求是由java层发起的。

查找模块1004,用于根据所述数据查询请求中包含的查询条件在数据库中查找得到与所述查询条件匹配的目标数据。

存储模块1006,用于将所述目标数据缓存到native层中的数据动态缓存区中,获取所述目标数据在所述数据动态缓存区中的存储地址,为所述存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层中的系统缓存区。

返回模块1008,用于从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据动态缓存区中提取相应的目标查询数据返回给java层。

如图11所示,在一个实施例中,上述数据查询装置还包括:

创建模块1005,用于当所述native层中不存在与所述数据查询请求对应的数据动态缓存区和系统缓存区时,在所述native层中创建与所述数据查询请求对应的数据动态缓存区和系统缓存区。

如图12所示,在一个实施例中,上述数据查询装置还包括:

更新提取模块1010,用于获取数据更新请求,根据所述数据更新请求的更新索引值从所述数据动态缓存区中提取与所述更新索引值相应的目标查询数据。

在一个实施例中,所述存储模块还用于读取存储在数据库中的目标数据,所述目标数据是以行为单位存储在数据库中的,其中,每一行的目标数据包含有多个列,以行为最小存储单位将每一行的目标数据存储到所述数据动态缓存区,其中,根据每一行中每一列对应的数据类型为所述每一列中的数据动态分配内存进行存储。

在一个实施例中,所述装置还包括:第一判断模块,用于当所述目标数据的数据量大于预设阈值时,则通知存储模块将所述目标数据缓存到native层中的数据动态缓存区中。

在一个实施例中,所述第一判断模块还用于当所述目标数据的数据量小于或等于预设阈值时,则将目标数据缓存到native层中的系统缓存区,从所述系统缓存区中提取相应的目标数据返回给java层;

在一个实施例中,所述装置还包括:第二判断模块,用于获取与所述查询条件对应的业务标识,当所述业务标识为第一类业务标识时,则通知存储模块将所述目标数据缓存到native层中的数据动态缓存区中。

在一个实施例中,所述第二判断模块还用于当所述业务标识为第二类业务标识时,则将目标数据缓存到native层中的系统缓存区,从所述系统缓存区中提取相应的目标数据返回给java层。

如图13所示,在一个实施例中,上述数据查询装置还包括:

数据库更新模块1012,用于接收数据变更请求,根据所述变更请求在所述数据库中变更相应的数据;

数据动态缓存区更新模块1014,用于当数据库中数据变更完毕后,更新所述数据动态缓存区中的相应的数据;

系统缓存区更新模块1016,用于当数据变更的类型为增加或删除时,则在系统缓存区相应地增加或删除索引项,生成新的索引关系;

重新获取模块1018,用于当新的所述索引关系生成后,通知所述java层重新从所述数据动态缓存区中获取相应的目标数据。

在一个实施例中,所述系统缓存区和所述数据动态缓存区存储在native层的匿名共享内存中。

如图14所示,在一个实施例中,提出了一种数据查询装置,所述装置包括:

查询请求获取模块1402,用于获取数据查询请求,所述数据查询请求是由java层发起的;

目标数据查找模块1404,根据所述数据查询请求中包含的查询条件在数据库中查找与所述查询条件匹配的目标数据;

索引关系存储模块1406,用于获取所述目标数据在所述数据库中的存储地址,为所述存储地址分配对应的索引值,根据所述索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层的系统缓存区;

数据返回模块1408,用于从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据库中提取相应的目标查询数据返回给java层。

图15示出了一个实施例中计算机设备的内部结构图。该计算机设备具体可以是终端。如图15所示,该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、输入装置和显示屏。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作系统,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现数据查询方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行数据查询方法。计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。本领域技术人员可以理解,图15中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

在一个实施例中,本申请提供的数据查询装置可以实现为一种计算机程序的形式,计算机程序可在如图15所示的计算机设备上运行。计算机设备的存储器中可存储组成该数据查询装置的各个程序模块,比如,图10所示的请求获取模块1002、查找模块1004、存储模块1006和返回模块1008。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的数据查询方法中的步骤。例如,图15所示的计算机设备可以通过如图10所示的数据查询装置中请求获取模块1002获取数据查询请求,所述数据查询请求是由java层发起的;通过查找模块1004根据所述数据查询请求中包含的查询条件在数据库中查找得到与所述查询条件匹配的目标数据;通过存储模块1006将所述目标数据缓存到native层中的数据动态缓存区中,获取所述目标数据在所述数据动态缓存区中的存储地址,为所述存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层中的系统缓存区;通过返回模块1008,用于从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据动态缓存区中提取相应的目标查询数据返回给java层。

在一个实施例中,提出了一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行以下步骤:获取数据查询请求,所述数据查询请求是由java层发起的;根据所述数据查询请求中包含的查询条件在数据库中查找得到与所述查询条件匹配的目标数据;将所述目标数据缓存到native层中的数据动态缓存区中,获取所述目标数据在所述数据动态缓存区中的存储地址,为所述存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层中的系统缓存区;从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据动态缓存区中提取相应的目标查询数据返回给java层。

在一个实施例中,所述处理器在执行所述获取数据查询请求,所述数据查询请求是由java层发起的步骤之后,还用于执行以下步骤:当所述native层中不存在与所述数据查询请求对应的数据动态缓存区和系统缓存区时,在所述native层中创建与所述数据查询请求对应的数据动态缓存区和系统缓存区。

在一个实施例中,所述处理器还用于执行以下步骤:获取数据更新请求,根据所述数据更新请求中包含的更新索引值从所述数据动态缓存区中提取与所述更新索引值相应的目标查询数据。

在一个实施例中,所述将所述目标数据缓存到native层中的数据动态缓存区中的步骤包括:读取存储在数据库中的目标数据,所述目标数据是以行为单位存储在数据库中的,其中,每一行的目标数据包含有多个列;以行为最小存储单位将每一行的目标数据存储到所述数据动态缓存区,其中,根据每一行中每一列对应的数据类型为所述每一列中的数据动态分配内存进行存储。

在一个实施例中,所述处理器在执行所述根据所述数据查询请求中包含的查询条件在数据库中查找与所述查询条件匹配的目标数据的步骤之后,还用于执行以下步骤:当所述目标数据的数据量大于预设阈值时,则进入将所述目标数据缓存到native层中的数据动态缓存区中的步骤。

在一个实施例中,所述处理器在执行所述将所述目标数据缓存到native层中的数据动态缓存区中的步骤之前,还用于执行以下步骤:获取与所述查询条件对应的业务标识;当所述业务标识为第一类业务标识时,则进入将所述目标数据缓存到native层中的数据动态缓存区中的步骤。

在一个实施例中,所述处理器还用于执行以下步骤:当所述目标数据的数据量小于或等于预设阈值时或当所述业务标识为第二类业务标识时,则将目标数据缓存到native层中的系统缓存区;从所述系统缓存区中提取相应的目标数据返回给java层。

在一个实施例中,所述处理器还用于执行以下步骤:接收数据变更请求,根据所述数据变更请求在所述数据库中变更相应的数据;当数据库中数据变更完毕后,更新所述数据动态缓存区中的相应的数据;当数据变更的类型为增加或删除时,则在系统缓存区相应地增加或删除索引项,生成新的索引关系;当新的所述索引关系生成后,通知所述java层重新从所述数据动态缓存区中获取相应的目标数据。

在一个实施例中,所述系统缓存区和所述数据动态缓存区存储在native层的匿名共享内存中。

在一个实施例中,提出了一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行以下步骤:获取数据查询请求,所述数据查询请求是由java层发起的;根据所述数据查询请求中包含的查询条件在数据库中查找与所述查询条件匹配的目标数据;获取所述目标数据在所述数据库中的存储地址,为所述存储地址分配对应的索引值,根据所述索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层的系统缓存区;从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据库中提取相应的目标查询数据返回给java层。

在一个实施例中,提出了一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行以下步骤:获取数据查询请求,所述数据查询请求是由java层发起的;根据所述数据查询请求中包含的查询条件在数据库中查找得到与所述查询条件匹配的目标数据;将所述目标数据缓存到native层中的数据动态缓存区中,获取所述目标数据在所述数据动态缓存区中的存储地址,为所述存储地址分配对应的索引值,根据索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层中的系统缓存区;从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据动态缓存区中提取相应的目标查询数据返回给java层。

在一个实施例中,所述处理器在执行所述获取数据查询请求,所述数据查询请求是由java层发起的步骤之后,还用于执行以下步骤:当所述native层中不存在与所述数据查询请求对应的数据动态缓存区和系统缓存区时,在所述native层中创建与所述数据查询请求对应的数据动态缓存区和系统缓存区。

在一个实施例中,所述处理器还用于执行以下步骤:获取数据更新请求,根据所述数据更新请求中包含的更新索引值从所述数据动态缓存区中提取与所述更新索引值相应的目标查询数据。

在一个实施例中,所述将所述目标数据缓存到native层中的数据动态缓存区中的步骤包括:读取存储在数据库中的目标数据,所述目标数据是以行为单位存储在数据库中的,其中,每一行的目标数据包含有多个列;以行为最小存储单位将每一行的目标数据存储到所述数据动态缓存区,其中,根据每一行中每一列对应的数据类型为所述每一列中的数据动态分配内存进行存储。

在一个实施例中,所述处理器在执行所述根据所述数据查询请求中包含的查询条件在数据库中查找与所述查询条件匹配的目标数据的步骤之后,还用于执行以下步骤:当所述目标数据的数据量大于预设阈值时,则进入将所述目标数据缓存到native层中的数据动态缓存区中的步骤。

在一个实施例中,所述处理器在执行所述将所述目标数据缓存到native层中的数据动态缓存区中的步骤之前,还用于执行以下步骤:获取与所述查询条件对应的业务标识;当所述业务标识为第一类业务标识时,则进入将所述目标数据缓存到native层中的数据动态缓存区中的步骤。

在一个实施例中,所述处理器还用于执行以下步骤:当所述目标数据的数据量小于或等于预设阈值时或当所述业务标识为第二类业务标识时,则将目标数据缓存到native层中的系统缓存区;从所述系统缓存区中提取相应的目标数据返回给java层。

在一个实施例中,所述处理器还用于执行以下步骤:接收数据变更请求,根据所述数据变更请求在所述数据库中变更相应的数据;当数据库中数据变更完毕后,更新所述数据动态缓存区中的相应的数据;当数据变更的类型为增加或删除时,则在系统缓存区相应地增加或删除索引项,生成新的索引关系;当新的所述索引关系生成后,通知所述java层重新从所述数据动态缓存区中获取相应的目标数据。

在一个实施例中,所述系统缓存区和所述数据动态缓存区存储在native层的匿名共享内存中。

在一个实施例中,提出了一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行以下步骤:获取数据查询请求,所述数据查询请求是由java层发起的;根据所述数据查询请求中包含的查询条件在数据库中查找与所述查询条件匹配的目标数据;获取所述目标数据在所述数据库中的存储地址,为所述存储地址分配对应的索引值,根据所述索引值与对应的存储地址生成索引关系,将所述索引关系存储在native层的系统缓存区;从所述系统缓存区获取所述索引关系,根据所述索引关系从所述数据库中提取相应的目标查询数据返回给java层。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。

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

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

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1