首页 / 专利库 / 人工智能 / 语言代码 / 硬件数据库的JDBC驱动方法及装置

硬件数据库的JDBC驱动方法及装置

阅读:753发布:2020-05-08

专利汇可以提供硬件数据库的JDBC驱动方法及装置专利检索,专利查询,专利分析的服务。并且本 发明 提供了一种 硬件 数据库 的JDBC驱动方法及装置,其中,该方法包括:根据Java代码层次的SQL语句的执行类型,调用JDBC 接口 中Statement类的相应执行方法,将SQL语句传递给允许Java代码与设定 语言代码 交互的方法;通过允许Java代码与设定语言代码交互的方法将SQL语句转换为设定语言代码层次的SQL语句并将其传入设定语言代码层次的解析器,以识别SQL语句的语法类型并以此返回硬件数据库所能适配的格式的语法树;将语法树分发至硬件数据库,以根据语法树执行相应操作并返回设定语言代码层次的执行结果信息;根据该执行结果信息返回Java代码层次的执行结果信息至JDBC接口,以输出执行结果信息。通过上述方案能够使硬件数据库服务于Java代码层次的应用程序的用户。,下面是硬件数据库的JDBC驱动方法及装置专利的具体信息内容。

1.一种硬件数据库的JDBC驱动方法,其特征在于,设定语言代码层次的硬件数据库与JDBC接口连接,所述方法包括:
根据接收的Java代码层次的SQL语句的执行类型,调用JDBC接口中Statement类的相应执行方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法;其中,设定语言与Java语言不同;
通过所述允许Java代码与设定语言代码交互的方法将所述Java代码层次的SQL语句转换为设定语言代码层次的SQL语句并将其传入设定语言代码层次的解析器,以识别所述SQL语句的语法类型,并根据识别的语法类型返回硬件数据库所能适配的格式的语法树;
将所述语法树分发至所述硬件数据库,以根据所述语法树执行相应操作并返回设定语言代码层次的执行结果信息;
根据设定语言代码层次的执行结果信息返回Java代码层次的执行结果信息至所述JDBC接口,以输出Java代码层次的执行结果信息。
2.如权利要求1所述的硬件数据库的JDBC驱动方法,其特征在于,所述SQL语句的执行类型为修改类型或查询类型。
3.如权利要求2所述的硬件数据库的JDBC驱动方法,其特征在于,在所述SQL语句的执行类型为修改类型的情况下,所述SQL语句的语法类型包括插入行、删除行、更新行、添加表及删除表的操作中的一个或多个,所述执行结果信息包括执行状态标识;
根据接收的Java代码层次的SQL语句的执行类型,调用JDBC接口中Statement类的相应执行方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法,包括:
根据接收的Java代码层次的SQL语句的执行类型,调用JDBC接口中Statement类的executeUpdate方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法。
4.如权利要求2所述的硬件数据库的JDBC驱动方法,其特征在于,在所述SQL语句的执行类型为查询类型的情况下,所述SQL语句的语法类型包括选择操作,所述执行结果信息包括查询结果集;
根据接收的Java代码层次的SQL语句的执行类型,调用JDBC接口中Statement类的相应执行方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法,包括:
根据接收的Java代码层次的SQL语句的执行类型,调用JDBC接口中Statement类的executeQuery方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法;
根据设定语言代码层次的执行结果信息返回Java代码层次的执行结果信息至所述JDBC接口,以输出Java代码层次的执行结果信息,包括:
将设定语言代码层次的查询结果集转换为Java代码层次的查询结果集,并将所述Java代码层次的查询结果集返回至所述JDBC接口,以输出Java代码层次的执行结果信息。
5.如权利要求4所述的硬件数据库的JDBC驱动方法,其特征在于,将设定语言代码层次的查询结果集转换为Java代码层次的查询结果集,并将所述Java代码层次的查询结果集返回至所述JDBC接口,以输出Java代码层次的执行结果信息,包括:
通过按设定字节格式移动指向设定语言代码层次的查询结果集的二维数组的指针,读取设定语言代码层次的查询结果集中的字节,并根据读取的字节提取查询结果集的表框信息;其中,设定语言代码层次的查询结果集是按所述设定字节格式存储的;
根据所述表框信息中的表单元数据的类型为同种表单元数据的类型的表单元数据,建立以其表单元数据的类型为键且以包括其表单元的编号的数组作为值的键值对字典;
通过将同种表单元数据的类型的表单元数据拷贝至Java代码层次的二维数组中紧邻存储,得到Java代码层次的查询结果集;
根据键值对字典将得到的Java代码层次的查询结果集中表单元数据填充至所述JDBC接口中ResultSet类实例的相应位置,以供遍历输出Java代码层次的查询结果集中表单元中的数据。
6.如权利要求5所述的硬件数据库的JDBC驱动方法,其特征在于,通过按设定字节格式移动指向设定语言代码层次的查询结果集的二维数组的指针,读取设定语言代码层次的查询结果集中的字节之前,还包括:
通过将指针指向设定语言代码层次的查询结果集的二维数组的首部,检查设定语言代码层次的查询结果集的二维数组是否为空,若是,返回空查询标识,若否,通过按设定字节格式移动指向设定语言代码层次的查询结果集的二维数组的指针,读取设定语言代码层次的查询结果集中的字节的步骤。
7.如权利要求5所述的硬件数据库的JDBC驱动方法,其特征在于,表单元为列或行。
8.如权利要求7所述的硬件数据库的JDBC驱动方法,其特征在于,在表单元为列的情况下,所述表框信息包括列数据类型,还包括列数、行数、列名、及最大列宽中的一个或多个。
9.如权利要求1至8任一项所述的硬件数据库的JDBC驱动方法,其特征在于,所述硬件数据库通过ODBC与基于设定语言代码层次的普通数据库连接;
将所述语法树分发至所述硬件数据库,以根据所述语法树执行相应操作并返回设定语言代码层次的执行结果信息之前,还包括:
通过所述JDBC接口中DriverManager类的getConnection方法对Connection类进行实例化,得到Connection类实例;
通过Connection类实例调用所述允许Java代码与设定语言代码交互的方法并基于ODBC方法建立所述硬件数据库和所述普通数据库的访问接口之间的连接;
基于建立的所述硬件数据库和所述普通数据库的访问接口之间的连接,将所述普通数据库中的数据表加载至所述硬件数据库。
10.如权利要求9所述的硬件数据库的JDBC驱动方法,其特征在于,
所述方法还包括:
返回建立的所述硬件数据库和所述普通数据库的访问接口之间的连接的编号;
根据设定语言代码层次的执行结果信息返回Java代码层次的执行结果信息至所述JDBC接口之后,还包括:
通过所述JDBC接口中Connection类的close方法,调用所述允许Java代码与设定语言代码交互的方法,根据所述连接的编号删除所述连接。
11.如权利要求9所述的硬件数据库的JDBC驱动方法,其特征在于,在所述SQL语句的执行类型为修改类型的情况下,将所述语法树分发至所述硬件数据库,以根据所述语法树执行相应操作并返回设定语言代码层次的执行结果信息之后,还包括:
基于建立的所述硬件数据库和所述普通数据库的访问接口之间的连接,将所硬件数据库中的修改内容同步至所述普通数据库。
12.如权利要求9所述的硬件数据库的JDBC驱动方法,其特征在于,所述允许Java代码与设定语言代码交互的方法为JNI,所述JDBC接口通过JNI与所述硬件数据库连接。
13.如权利要求12所述的硬件数据库的JDBC驱动方法,其特征在于,通过所述允许Java代码与设定语言代码交互的方法将所述Java代码层次的SQL语句转换为设定语言代码层次的SQL语句并将其传入设定语言代码层次的解析器,以识别所述SQL语句的语法类型,并根据识别的语法类型返回硬件数据库所能适配的格式的语法树,包括:
通过JNI中的parse方法将所述Java代码层次的SQL语句转换为设定语言代码层次的SQL语句并将其传入设定语言代码层次的解析器,以识别所述SQL语句的语法类型,并根据识别的语法类型返回硬件数据库所能适配的格式的语法树。
14.如权利要求12所述的硬件数据库的JDBC驱动方法,其特征在于,通过Connection类实例调用所述允许Java代码与设定语言代码交互的方法并基于ODBC方法建立所述硬件数据库和所述普通数据库的访问接口之间的连接,包括:
通过Connection类实例调用JNI中的buildConnection并基于ODBC方法建立所述硬件数据库和所述普通数据库的访问接口之间的连接。
15.如权利要求10所述的硬件数据库的JDBC驱动方法,其特征在于,在所述允许Java代码与设定语言代码交互的方法为JNI的情况下,通过所述JDBC接口中Connection类的close方法,调用所述允许Java代码与设定语言代码交互的方法,根据所述连接的编号删除所述连接,包括:
通过所述JDBC接口中Connection类的close方法调用JNI中的deleteConnection根据所述连接的编号删除所述连接。
16.如权利要求12所述的硬件数据库的JDBC驱动方法,其特征在于,设定语言为C++语言。
17.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至16任一项所述方法的步骤。
18.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1至16任一项所述方法的步骤。

说明书全文

硬件数据库的JDBC驱动方法及装置

技术领域

[0001] 本发明涉及数据库技术领域,尤其涉及一种硬件数据库的JDBC驱动方法及装置。

背景技术

[0002] 目前,对数据库(如MySQL、Oracle等普通数据库)的访问主要依赖主机CPU(Central Processing Unit,中央处理器),当数据访问量过大时,仅凭借主机CPU的计算读取数据库的数据表将会耗费大量时间。
[0003] 硬件数据库可以基于硬件独立计算,对普通数据库中数据表的访问任务由硬件承担和完成,而不需要主机CPU的过多参与,所以利用硬件数据库能够大大减小访问数据库时对主机CPU的依赖。访问硬件数据库的代码层次例如为C++,然而,由于Java有各式各样的框架,能实现丰富的业务逻辑,且具有良好的生态环境,所以,目前主流使用到数据库的场景多是在Java代码层次,即,使用JDBC标准接口来实现对数据库的增删查改。
[0004] 然而,目前的JDBC标准接口无法实现Java代码层次用户应用程序与硬件数据库的适配。

发明内容

[0005] 有鉴于此,本发明实施例提供了一种硬件数据库的JDBC驱动方法及装置,以使硬件数据库能够服务于Java代码层次的应用程序的用户。
[0006] 为了达到上述目的,本发明采用以下方案实现:
[0007] 根据本发明实施例的一个方面,提供了一种硬件数据库的JDBC驱动方法,设定语言代码层次的硬件数据库与JDBC接口连接,所述方法包括:
[0008] 根据接收的Java代码层次的SQL语句的执行类型,调用JDBC接口中Statement类的相应执行方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法;其中,设定语言与Java语言不同;
[0009] 通过所述允许Java代码与设定语言代码交互的方法将所述Java代码层次的SQL语句转换为设定语言代码层次的SQL语句并将其传入设定语言代码层次的解析器,以识别所述SQL语句的语法类型,并根据识别的语法类型返回硬件数据库所能适配的格式的语法树;
[0010] 将所述语法树分发至所述硬件数据库,以根据所述语法树执行相应操作并返回设定语言代码层次的执行结果信息;
[0011] 根据设定语言代码层次的执行结果信息返回Java代码层次的执行结果信息至所述JDBC接口,以输出Java代码层次的执行结果信息。
[0012] 一些实施例中,所述硬件数据库通过ODBC与基于设定语言代码层次的普通数据库连接;将所述语法树分发至所述硬件数据库,以根据所述语法树执行相应操作并返回设定语言代码层次的执行结果信息之前,所述的硬件数据库的JDBC驱动方法,还包括:
[0013] 通过所述JDBC接口中DriverManager类的getConnection方法对Connection类进行实例化,得到Connection类实例;
[0014] 通过Connection类实例调用所述允许Java代码与设定语言代码交互的方法并基于ODBC方法建立所述硬件数据库和所述普通数据库的访问接口之间的连接;
[0015] 基于建立的所述硬件数据库和所述普通数据库的访问接口之间的连接,将所述普通数据库中的数据表加载至所述硬件数据库。
[0016] 一些实施例中,所述允许Java代码与设定语言代码交互的方法为JNI。
[0017] 一些实施例中,设定语言为C++语言。
[0018] 根据本发明实施例的另一个方面,提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述实施例所述方法的步骤。
[0019] 根据本发明实施例的又一个方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述实施例所述方法的步骤。
[0020] 本发明实施例的硬件数据库的JDBC驱动方法、电子设备及计算机可读存储介质,能够通过修改JDBC接口的实现层,调用设定语言所支持的方法,在设定语言代码层次与硬件数据库的交互。从JDBC接口请求的SQL查询,得到硬件数据库的查询结果,并返回此查询结果集供JDBC接口获取。用户的应用程序通过调用本发明实施例的硬件数据库的JDBC驱动方法,按照JDBC的标准接口,对硬件数据库的内容进行访问,从而能够使硬件数据库能够服务于Java代码层次的应用程序的用户,高效完成查询与执行操作,起到数据库访问加速的效果。附图说明
[0021] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
[0022] 图1是本发明一实施例的硬件数据库的JDBC驱动方法的流程示意图;
[0023] 图2是本发明另一实施例的硬件数据库的JDBC驱动方法的流程示意图;
[0024] 图3是本发明一具体实施例的面向硬件数据库的数据库JDBC驱动的流程示意图;
[0025] 图4是本发明一具体实施例中的创建连接和关闭连接的流程示意图;
[0026] 图5是本发明一具体实施例中的SQL语句传递流程示意图;
[0027] 图6是本发明一具体实施例中的结果集解码流程示意图。

具体实施方式

[0028] 为使本发明实施例的目的、技术方案和优点更加清楚明白,下面结合附图对本发明实施例做进一步详细说明。在此,本发明的示意性实施例及其说明用于解释本发明,但并不作为对本发明的限定。
[0029] JDBC(Java Data Base Connectivity,Java数据库连接)是一种能够为多种关系型数据库提供统一访问的Java API(Java应用程序接口),允许Java应用程序与普通数据库进行交互,以执行SQL查询等操作。访问硬件数据库的代码层次一般不是Java,例如为C++,若要使用户的Java应用程序能够访问硬件数据库,需要对硬件数据库的访问进行软件层次上的适配。
[0030] 为了解决上述问题,本发明实施例提供了一种硬件数据库的JDBC驱动方法,通过修改后的JDBC接口驱动硬件数据库,实现使Java应用程序访问硬件数据库。
[0031] 需要预先说明的是,硬件数据库是基于硬件的数据库,例如,可以是基于FPGA(Field-Programmable Gate Array,现场可编程阵列)、ASIC(Application Specific Integrated Circuit,专用集成电路)、GPU(Graphics Processing Unit,图形处理器)等专用硬件计算、管理与存储的数据库,可以从普通数据库中获取数据源,能够完成用户应用程序提交的SQL语句中的至少部分任务。JDBC接口的一端可以直接或间接连接硬件数据库,另一端可以连接用户的应用程序,后述JDBC接口可以是指现有JDBC接口,其具体改进通过步骤内容进行描述。另外,普通数据库可以是指基于CPU的主流数据库,例如,Oracle,MySQL等。
[0032] 图1是本发明一实施例的硬件数据库的JDBC驱动方法的流程示意图。参见图1,在设定语言代码层次的硬件数据库与JDBC接口连接的情况下,一些实施例的硬件数据库的JDBC驱动方法,可包括以下步骤S110至步骤S140。其中,该设定语言代码层次的硬件数据库可以是指能够在该设定语言代码层次进行访问的硬件数据库。该设定语言是不同于Java的语言,例如,可以为C++、C等。
[0033] 下面将对步骤S110至步骤S140的具体实施方式进行详细说明。
[0034] 步骤S110:根据接收的Java代码层次的SQL语句的执行类型,调用JDBC接口中Statement类的相应执行方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法;其中,设定语言与Java语言不同。
[0035] 该步骤S110中,所述SQL语句的执行类型可以为修改类型或查询类型。实际上,修改类型更具体地可以包括插入行、删除行、更新行、添加表及删除表等修改中的一个或多个。所以在其他实施例中,所述SQL语句的执行类型可以划分为更具体的类型,具体地,可以根据JDBC接口中Statement类中的具体执行方法来确定。
[0036] 例如,在所述SQL语句的执行类型为修改类型的情况下,所述SQL语句的语法类型可包括插入行、删除行、更新行、添加表及删除表的操作中的一个或多个,此时,该步骤S110,即,根据接收的Java代码层次的SQL语句的执行类型,调用JDBC接口中Statement类的相应执行方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法,更具体地,可包括步骤:S1111,根据接收的Java代码层次的SQL语句的执行类型,调用JDBC接口中Statement类的executeUpdate方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法。
[0037] 该步骤S1111中,通过Statement类的executeUpdate方法能够将涉及修改数据库的SQL语句传递给允许Java代码与设定语言代码交互的方法,此时,后述步骤中(例如,步骤S130、步骤S140)所述执行结果信息可包括执行状态标识,该执行状态标识可以是成功或失败。
[0038] 再例如,在所述SQL语句的执行类型为查询类型的情况下,后述步骤S120中的SQL语句的语法类型可以包括选择操作,此时,该步骤S110,即,根据接收的Java代码层次的SQL语句的执行类型,调用JDBC接口中Statement类的相应执行方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法,更具体地,可包括步骤:S1121,根据接收的Java代码层次的SQL语句的执行类型,调用JDBC接口中Statement类的executeQuery方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法;
[0039] 对于不涉及修改数据库的SQL语句,例如查询语句,该步骤S1121中的SQL语句的执行类型可以是查询类型,后述步骤S120中的SQL语句的语法类型可以是识别为选择操作。SQL语句的语法类型和SQL语句的执行类型的区别主要在于划分可能不同。
[0040] 该步骤S1121中,通过Statement类的executeQuery方法能够将不涉及修改数据库的SQL语句传递给允许Java代码与设定语言代码交互的方法,此时,后述步骤中(例如,步骤S130、步骤S140)所述执行结果信息可包括查询结果集,其中,该查询结果集可包括需要返回给用户的应用程序的数据。
[0041] 上述步骤S110中,允许Java代码与设定语言代码交互的方法可以是各种能够实现Java代码与另一种语言交互的方法,可以实现语言代码层的转换。允许Java代码与设定语言代码交互的方法可以是现有的方法或自行编写代码实现的方法,例如,可以是现有的JNI(Java Native Interface,Java本地接口)方法或改进的JNI方法,JNI方法可以提供允许Java代码与C/C++代码交互的标准机制,通过JNI方法能够实现Java代码与C/C++代码之间的交互。
[0042] Java代码层次的SQL语句可以指来自Java应用程序的SQL语句。该JDBC接口可以是指现有的JDBC标准接口。用户可以通过Java应用程序将SQL语句请求提交至该JDBC接口,但现有的JDBC接口是在Java代码层次连接数据库,所以直接使用现有的JDBC接口的连接数据库的方法无法连接硬件数据库。为此,该步骤S110中,JDBC接口接收到Java代码层次的SQL语句之后,不是将Java代码层次的SQL语句直接传递给硬件数据库,而是传递给允许Java代码与设定语言代码交互的方法,能够实现从Java代码层次到设定语言代码层次的转换。
[0043] 步骤S120:通过所述允许Java代码与设定语言代码交互的方法将所述Java代码层次的SQL语句转换为设定语言代码层次的SQL语句并将其传入设定语言代码层次的解析器,以识别所述SQL语句的语法类型,并根据识别的语法类型返回硬件数据库所能适配的格式的语法树。
[0044] 该步骤S120中,设定语言代码层次的解析器可以通过在硬件数据库外部采用设定语言编写代码实现,其主要作用是识别出SQL语句的语法类型,并根据识别的语法类型返回语法树。其中,该语法类型可以为修改类型或查询类型,对于修改类型更具体地可以识别为插入行、删除行、更新行、添加表或删除表的操作,对于查询类型可以识别为选择操作。可以预先根据各种语法类型配置语法树(查询执行器,配置的语法树的格式应具有硬件数据库能够适配的格式),之后解析器可以根据识别的语法类型在配置的语法树中找到所需的语法树并返回该语法树。其中,语法树中可以起到查询执行器的作用,可以采用设定语言代码编写代码实现,可以包含操作节点和节点之间的连接关系。另外,硬件数据库所能适配的格式可以包括数据存储格式等,具体可以具体硬件数据库而定。此外,上述解析器和语法树可以在内存中执行。
[0045] 为了让设定语言代码层次的硬件数据库的应用编程接口接入Java代码层次的JDBC接口,需要考虑Java代码层次与设定语言代码层次的交互。而通过允许Java代码与设定语言代码交互的方法,允许Java代码层次调用设定语言代码函数的接口。所以,在上述步骤S110中,调用JDBC接口中Statement类的相应执行方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法,在该步骤S120中,通过所述允许Java代码与设定语言代码交互的方法将所述Java代码层次的SQL语句转换为设定语言代码层次的SQL语句并将其传入设定语言代码层次的解析器,能够在Java代码层次中给出函数声明,然后可以在设定语言代码层次对这些函数声明作实现,并可以再将设定语言代码编译成动态链接库,供Java代码层次调用,从而可以完成Java代码层次调用设定语言代码层次的操作,实现Java层次应用程序与设定语言代码层硬件数据库的通信和适配。
[0046] 该步骤S120中,允许Java代码与设定语言代码交互的方法可以连接于JDBC接口与硬件数据库之间,从而起到传递SQL语句的作用。例如,允许Java代码与设定语言代码交互的方法可以是JNI,此时,JNI可以连接于JDBC接口与硬件数据库之间,换言之,所述JDBC接口可以通过JNI与所述硬件数据库连接。
[0047] 通过允许Java代码与设定语言代码交互的方法将所述Java代码层次的SQL语句转换为设定语言代码层次的SQL语句的具体实现方式可以利用现有技术实现,例如JNI中的parse方法,或者,可以通过自行编写代码实现。
[0048] 示例性地,该步骤S120,即,通过所述允许Java代码与设定语言代码交互的方法将所述Java代码层次的SQL语句转换为设定语言代码层次的SQL语句并将其传入设定语言代码层次的解析器,以识别所述SQL语句的语法类型,并根据识别的语法类型返回硬件数据库所能适配的格式的语法树,更具体地,可包括步骤:S121,通过JNI中的parse方法将所述Java代码层次的SQL语句转换为设定语言代码层次的SQL语句并将其传入设定语言代码层次的解析器,以识别所述SQL语句的语法类型,并根据识别的语法类型返回硬件数据库所能适配的格式的语法树。
[0049] 若要让C++代码层次的硬件数据库的应用编程接口接入Java代码层次,需要考虑Java代码层次与C++代码层次的交互。而现有JNI技术能够提供Java向C++通信的方法,允许Java代码层次调用C++函数的接口。上述步骤S110,具体可以通过调用JDBC接口中Statement类的相应执行方法,将所述Java代码层次的SQL语句传递给JNI;该步骤S121中,通过JNI中的parse方法将SQL语句从Java代码层次转入C++代码层次。如此一来,在Java代码层次中给出函数声明,然后可以在C++代码层次对这些函数声明作实现,并可以再将C++代码编译成动态链接库,供Java代码层次调用,从而可以完成Java代码层次调用C++代码层次的操作,实现Java层次应用程序与C++代码层硬件数据库的通信和适配。
[0050] 步骤S130:将所述语法树分发至所述硬件数据库,以根据所述语法树执行相应操作并返回设定语言代码层次的执行结果信息。
[0051] 该步骤S130中,该语法树是由设定语言代码层次的解析器返回,且格式能够适配硬件数据库,该语法树包含语句需要执行的内容,所以这样可以将该语法树传入硬件数据库,从而可以执行SQL语句。
[0052] 在SQL语句的类型不同的情况下,硬件数据库返回的执行结果信息可以有所不同。例如,在步骤S120中的SQL语句的执行类型为修改类型的情况下,该步骤S130中,返回的执行结果信息可以包括执行状态标识,可以标识修改是否成功。再例如,在步骤S120中的SQL语句的执行类型为查询类型的情况下,执行结果信息可以为查询得到的数据内容。
[0053] 步骤S140:根据设定语言代码层次的执行结果信息返回Java代码层次的执行结果信息至所述JDBC接口,以输出Java代码层次的执行结果信息。
[0054] 在SQL语句的执行类型为修改类型的情况下,数据库执行了修改动作,可以不需返回数据至客户端,所以,可以只返回执行结果状态,例如,执行成功或失败,至JDBC接口,以使JDBC接口将执行结果状态展示给客户端,换言之,此时,执行结果信息可只包括执行结果状态。
[0055] 在SQL语句的执行类型为查询类型的情况下,一般需要返回查询的数据至客户端,在此情况下,该步骤S140,即,根据设定语言代码层次的执行结果信息返回Java代码层次的执行结果信息至所述JDBC接口,以输出Java代码层次的执行结果信息,具体地,可包括步骤:S1411,将设定语言代码层次的查询结果集转换为Java代码层次的查询结果集,并将所述Java代码层次的查询结果集返回至所述JDBC接口,以输出Java代码层次的执行结果信息。
[0056] 进一步地,该步骤S1411,更具体地,可包括步骤:S14111,通过按设定字节格式移动指向设定语言代码层次的查询结果集的二维数组的指针,读取设定语言代码层次的查询结果集中的字节,并根据读取的字节提取查询结果集的表框信息;其中,设定语言代码层次的查询结果集是按所述设定字节格式存储的;S14112,根据所述表框信息中的表单元数据的类型为同种表单元数据的类型的表单元数据,建立以其表单元数据的类型为键且以包含其表单元的编号的数组作为值的键值对字典;S14113,通过将同种表单元数据的类型的表单元数据拷贝至Java代码层次的二维数组中紧邻存储,得到Java代码层次的查询结果集;S14114,根据键值对字典将得到的Java代码层次的查询结果集中表单元数据填充至所述JDBC接口中ResultSet类实例的相应位置,以供遍历输出Java代码层次的查询结果集中表单元中的数据。
[0057] 该步骤S14111中,由于设定语言代码层次的查询结果集是按所述设定字节格式存储的,所以,通过按设定字节格式移动指向设定语言代码层次的查询结果集的二维数组的指针,每次能够读取得到具有一个信息单元的字节,例如,某一列中一行的表数据。该步骤S14112中,包含表单元的编号的数组可以是由表单元的编号组成的数组或数据,或者可以以其他方式形成键值对中的值。一个表单元可以对应由一个类型和一个编号组成的键值对,不同表单元的键值对可不同,具体地,类型可能不同或相同,且编号不同。该步骤S14112至步骤S14114中,该表框信息包括表单元数据的类型,其中,表单元可以是列或行,则,表单元数据的类型可以相应地是列数据类型或行数据类型。具体地,例如,在表单元为列的情况下,所述表框信息除了包括表单元数据类型(即,列数据类型),还可包括列数、行数、列名、及最大列宽中的一个或多个。再例如,在表单元为行的情况下,所述表框信息除了包括表单元数据类型(即,行数据类型),还可包括列数、行数、行名、及最大行宽中的一个或多个。根据表框信息可以对字节层次上的查询结果集进行解析。
[0058] 上述步骤S14112和S14113中,所有表单元数据的类型可能可以分为几种,将同一种类型的表单元数据按类型存储以类型为键,以表单元的编号组成的数组为值,构成键值字典对,并将同种类型的表单元数据拷贝至Java代码层次的二维数组中紧邻存储(以列为表单元时,可以是并排存储),以此能够将同种类型的表单元数据存储在同一存储空间中,以此可以便于简化存储管理,且便于统一进行数据类型的转换。
[0059] 上述步骤S14114中,JDBC接口中ResultSet类实例中可以包含用于存储查询结果的数组,该数组可以具有索引,该索引与键值对字典中的编号可以对应起来,所以,可以根据键值对字典读取表单元数据,并填充到ResultSet类实例中数组的相应位置(索引位置)。JDBC接口中ResultSet类实例中用于存储结果的位置填充数据后,可以展示至客户端。
[0060] 更进一步地,该步骤S14111之前,即,通过按设定字节格式移动指向设定语言代码层次的查询结果集的二维数组的指针,读取设定语言代码层次的查询结果集中的字节之前,各实施例的所述的方法还可包括步骤:S14115,通过将指针指向设定语言代码层次的查询结果集的二维数组的首部,检查设定语言代码层次的查询结果集的二维数组是否为空,若是,返回空查询标识,若否,通过按设定字节格式移动指向设定语言代码层次的查询结果集的二维数组的指针,读取设定语言代码层次的查询结果集中的字节的步骤(步骤S14111)。
[0061] 该步骤S14115中,在按设定字节格式移动指针并读取数据之前,可以先将指针指向数据首部,若首部没有数据,则其他数组位置都没有数据,则说明查询结果为空,则不需继续移动指针来尝试读取查询结果。以此,在查询结果为空的情况,可以快速返回为空的查询结果。
[0062] 各实施例的所述的硬件数据库的JDBC驱动方法中,通过利用JDBC接口在Java代码层次声明,然后利用允许Java代码与设定语言代码交互的方法转入设定语言代码,从而在设定语言代码层次进行实现,可供Java代码调用,从而可以实现Java代码层次的应用程序和设定语言代码层次的硬件数据库的对接。
[0063] 另外,硬件数据库的数据源可以来自普通数据库,可以预先将估计所需的表数据从普通数据库加载至硬件数据库,或者,通过JDBC接口驱动的方式将所需表数据加载至硬件数据库。例如,可以通过JDBC驱动并利用ODBC(Open Database Connectivity,统一数据库连接)加载表数据至硬件数据库。
[0064] 图2是本发明另一实施例的硬件数据库的JDBC驱动方法的流程示意图。参见图2,所述硬件数据库可以通过ODBC与基于设定语言代码层次的普通数据库连接,在此情况下,图1所述的硬件数据库的JDBC驱动方法,在步骤S130之前,即,将所述语法树分发至所述硬件数据库,以根据所述语法树执行相应操作并返回设定语言代码层次的执行结果信息之前,还可包括:
[0065] 步骤S150:通过所述JDBC接口中DriverManager类的getConnection方法对Connection类进行实例化,得到Connection类实例;
[0066] 步骤S160:通过Connection类实例调用所述允许Java代码与设定语言代码交互的方法并基于ODBC方法建立所述硬件数据库和所述普通数据库的访问接口之间的连接;
[0067] 步骤S170:基于建立的所述硬件数据库和所述普通数据库的访问接口之间的连接,将所述普通数据库中的数据表加载至所述硬件数据库。
[0068] 上述步骤S160中,允许Java代码与设定语言代码交互的方法可以是JNI,所述JDBC接口可以通过JNI与所述硬件数据库连接。上述设定语言可以为C语言或C++语言。
[0069] 在允许Java代码与设定语言代码交互的方法为JNI的情况下,上述步骤S160,即,通过Connection类实例调用所述允许Java代码与设定语言代码交互的方法并基于ODBC方法建立所述硬件数据库和所述普通数据库的访问接口之间的连接,具体地,可包括步骤:S161,通过Connection类实例调用JNI中的buildConnection并基于ODBC方法建立所述硬件数据库和所述普通数据库的访问接口之间的连接。
[0070] 该步骤S161中,硬件数据库和普通数据库均在设定语言代码层次上,所以,具体可以利用JNI中的buildConnection使用ODBC中的分匹配句柄和创建连接方法建立硬件数据库和普通数据库之间的连接。
[0071] 上述步骤S170中,在建立硬件数据库和普通数据库之间的连接后,可以将普通数据库的表数据加载至硬件数据库中,以做好数据准备。
[0072] 在所述SQL语句的执行类型为修改类型的情况下,硬件数据库执行完语句的相应操作后,不再修改数据库中的表数据,此时,可以基于硬件数据库和普通数据库之间的连接将对表数据的修改同步至普通数据库,以使数据库保持一致。
[0073] 示例性地,在所述SQL语句的执行类型为修改类型的情况下,上述步骤S130之后,即,将所述语法树分发至所述硬件数据库,以根据所述语法树执行相应操作并返回设定语言代码层次的执行结果信息之后,各实施例所述的硬件数据库的JDBC驱动方法,还可包括步骤:S180,基于建立的所述硬件数据库和所述普通数据库的访问接口之间的连接,将所硬件数据库中的修改内容同步至所述普通数据库。以此,可以保持硬件数据库和普通数据库的修改一致性。
[0074] 在其他实施例中,可以采用其他方式将所硬件数据库中的修改内容同步至所述普通数据库。另外,若SQL语句的执行类型为查询类型,没有改动数据库中的表数据,则可不必执行上述步骤S180。
[0075] 在另一些实施例中,图2所示的硬件数据库的JDBC驱动方法,还可包括步骤:S190,返回建立的所述硬件数据库和所述普通数据库的访问接口之间的连接的编号。在建立连接之后,可以针对该连接生成相应的编号,然后通过该步骤S190可使JDBC接口得到该编号,以便后续删除/释放连接。例如,在上述步骤S140之后,即,根据设定语言代码层次的执行结果信息返回Java代码层次的执行结果信息至所述JDBC接口之后,图2所示的硬件数据库的JDBC驱动方法,还可包括步骤:S1100,通过所述JDBC接口中Connection类的close方法,调用所述允许Java代码与设定语言代码交互的方法,根据所述连接的编号删除所述连接。该步骤S1100中,可以根据连接的编号找到连接相关内容,从而进行连接的删除/释放。
[0076] 进一步地,在所述允许Java代码与设定语言代码交互的方法为JNI的情况下,上述步骤S1100,即,通过所述JDBC接口中Connection类的close方法,调用所述允许Java代码与设定语言代码交互的方法,根据所述连接的编号删除所述连接,更具体地,可包括步骤:S1101,通过所述JDBC接口中Connection类的close方法调用JNI中的deleteConnection根据所述连接的编号删除所述连接。在其他实施例中,可以通过其他方式删除连接。
[0077] 上述各实施例中,通过利用ODBC技术创建连接供JDBC接口调用,能够在JDBC的驱动下实现硬件数据库和普通数据库的连接,从而可以基于该连接实现硬件数据库和普通数据库的表数据同步。
[0078] 另外,本发明实施例还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述各实施例所述的硬件数据库的JDBC驱动方法的步骤。该电子设备可以是计算机、服务器、芯片等,本发明对此不作限定。
[0079] 本发明实施例另提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述各实施例所述的硬件数据库的JDBC驱动方法的步骤。
[0080] 为使本领域技术人员更好地了解本发明,下面将以具体实施例说明本发明的实施方式。
[0081] 为了让硬件数据库的应用编程接口接入Java代码层次,需要考虑Java代码层次与C++代码层次交互的细节。现有的JNI技术提供了Java向C++通信的方法,允许Java代码层次调用C++函数的接口。在Java代码层次中给出函数声明,然后在C++代码层次对这些函数声明作实现,再将C++代码编译成动态链接库,供Java代码层次调用。从而完成Java代码层次调用C++代码层次方法的操作。使用JNI技术,为Java层次与硬件数据库的通信提供了可能。
[0082] 硬件数据库的数据来源于主流的数据库系统,也需要在C++层次上与主流数据库系统通信的方法。ODBC技术提供了访问异构数据库的统一接口,允许在C++代码层次上执行SQL语句,获取查询结果。用上ODBC技术,能够实现主流数据库到硬件数据库的数据迁移与同步。
[0083] 所以,该实施例基于JDBC技术、JNI技术和ODBC技术等,提出了一种面向硬件数据库的数据库JDBC驱动。
[0084] 图3是本发明一具体实施例的面向硬件数据库的数据库JDBC驱动的流程示意图。图4是本发明一具体实施例中的创建连接和关闭连接的流程示意图。图5是本发明一具体实施例中的SQL语句传递流程示意图。图6是本发明一具体实施例中的结果集解码流程示意图。
[0085] 一具体实施例的面向硬件数据库的数据库JDBC驱动方法,可包括连接管理过程、SQL语句传递过程和结果集解码过程。其中,硬件数据库可以是基于FPGA、ASIC等专用硬件计算、管理与存储的数据库。主流数据库(普通数据库)可以是如Oracle、MySql等的业界主流应用的数据库。参见图3,该实施例的驱动方法可包括以下步骤S1至S3:
[0086] S1:当应用程序调用JDBC驱动来建立与数据库的连接时,不执行原生JDBC标准建立数据库连接的底层代码,而是转到C++代码层次初始化连接管理模
[0087] 在本步骤S1中,将JDBC标准涉及数据库管理的Connection类的实现部分进行修改,弃用Java代码层次对数据库连接的方法,改用C++代码层次的方法对数据库进行连接,在C++代码层次内部管理对数据库的读写访问。Java代码层次负责对数据库连接句柄进行记录,创建和删除连接句柄的代码实现都在C++代码层次完成。对于数据库的访问,利用ODBC(用于连接数据源来访问数据库的接口规范)技术创建了与主流数据库的连接,分配了相关的连接句柄,并对涉及硬件数据库管理的部分进行初始化。针对不同数据库,其数据类型集合的定义也有所差异,由不同的数据类型需要转换成C++所支持的数据格式。根据SQL语句类型的不同,用户会使用不同的JDBC标准接口函数,但调用了同一个JNI(通过JNI技术,可以允许在Java代码层次声明,在C++代码层次中实现)本地方法来传递SQL语句,随后在C++代码层次对SQL语句进行解析,并进行相应的处理。
[0088] 参见图4,连接管理过程可包括以下步骤:
[0089] (1)在Java代码层次,用户应用程序通过JDBC标准接口中DriverManager类的getConnection方法,实例化Connection类;
[0090] (2)Connection类实例调用了JNI本地方法buildConnection,转入到C++代码层次;
[0091] (3)在buildConnection方法实现中根据传入的连接参数,以ODBC技术建立对数据源的连接,此数据源是主流数据库对外暴露的访问接口,通过数据源可以访问到主流数据库的数据表;
[0092] (4)初始化涉及到管理硬件数据库的其他模块,用于后续进行硬件数据库与主流数据库的同步;
[0093] (5)两数据库同步完成后,应用程序可以开始访问硬件数据库中的数据表;
[0094] (6)返回数据库连接的编号,会在后续释放连接的时候使用;用户应用程序通过JDBC标准接口中Connection类的close方法,调用JNI本地方法的deleteConnection,凭借编号删除数据库连接。
[0095] S2:用户应用程序通过已建立的数据库连接,传递SQL语句,交给C++代码层次的解析器进行语法分析。
[0096] 在该步骤S2中,将对涉及执行查询的类,即JDBC中Statement类的实现部分进行修改。SQL语句传递模块将SQL语句传递给C++代码层次的语法解析器,对SQL语句的语句类型进行判断,按照类型分发给不同的查询执行器(语法树)。
[0097] 参见图5,SQL语句传递过程可包括以下步骤:
[0098] (1)若要增加、删除、修改数据库的数据用户应用程序调用JDBC标准接口中Statement类的executeUpdate方法;若要执行查询语句,则调用JDBC标准接口中Statement类的executeQuery方法;两者都是传递SQL语句给JNI本地方法parse,转入到C++代码层次;
[0099] (2)parse方法将SQL语句传入解析器进行语法解析,判断语法类型:对于修改数据库数据的语法类型,识别为插入行、删除行、更新行、添加表、删除表等操作;对于查询数据库数据的语法类型,识别为选择列操作;
[0100] (3)对于不同的语法类型,将解析器返回的语法树,分发到硬件数据库的输入端;其中,此语法树是硬件数据库所能适配的格式;
[0101] (4)针对查询数据库数据的选择列操作,硬件数据库设置为只读模式,硬件数据库以特定的字节格式返回其查询结果。针对其他要改动数据库内容的操作,硬件数据库为写入模式,硬件数据库返回执行状态标识。
[0102] S3:从硬件数据库得到特定字节格式查询结果后,结果集解码模块对其进行解码。
[0103] 该步骤S3将涉及查询结果集的类,即对JDBC中ResultSet类的实现部分进行修改。该步骤S3定义了一种按字节存储结果集的格式,对硬件数据库返回的查询结果集进行字节层次上的解码。包括对查询数据表的列数、行数、列名、列数据类型、最大列宽等表框信息(用于描述一个数据表属性的信息)的获取,还包括对数据表各种数据类型的单元数据按列为单位进行提取。在C++代码层次,把相同数据类型的列单元数据,并排放置到同种数据类型的存储空间中。经过统一数据类型的转换,把C++的存储地址变为Java的存储地址。随后,在Java代码层次,根据行大小和列大小开辟空间,将列单元数据根据列索引按序放回,从而得到查询结果集。
[0104] 参见图6,该步骤S3(结果集解码)的执行过程包括以下步骤:
[0105] (1)在C++代码层次,对于硬件数据库返回的特定字节格式的结果集,通过指针指向结果集的首部,检查是否为空,若为空,则直接结束,返回空查询标识;否则进行第(2)步;
[0106] (2)按照特定字节格式,进行指针移动,读取相应的字节,提取表框信息各属性;
[0107] (3)对于同种列数据类型的列,建立起键值对字典,以列数据类型为键,以多个列编号组成的数组作为值;
[0108] (4)将同种列数据类型的列,以列为第一维度,以行为第二维度,拷贝相应字节数的表单元数据(如,数据表按照行列索引的单元格中的存储数据)到二维数组中,依次按列并排存储每列数据;
[0109] (5)将C++代码层次的二维数组存储地址,转换成Java代码层次的二维数组存储地址;
[0110] (6)在Java代码层次,将同种数据类型的二维数组,根据键值对字典,将每一列数据依次填充到正确的索引(编号)位置,构成可直接展示的查询结果集;
[0111] (7)返回为ResultSet类实例,允许应用程序调用next按行遍历等方法获取SQL语句的查询结果集,或者获取SQL语句的执行情况。
[0112] 本实施例中,通过修改JDBC接口的实现层,调用C++语言支持的方法,在C++代码层次与硬件数据库的交互。从JDBC接口请求的SQL查询,得到硬件数据库的查询结果,并返回此查询结果集供JDBC接口获取。用户的应用程序调用本实施例的面向硬件数据库的JDBC驱动包,按照JDBC的标准接口,对硬件数据库的内容进行访问,从而完成高效查询与执行,起到数据库加速的效果。
[0113] 综上所述,本发明实施例的硬件数据库的JDBC驱动方法、电子设备及计算机可读存储介质,通过根据接收的Java代码层次的SQL语句的执行类型,调用JDBC接口中Statement类的相应执行方法,将所述Java代码层次的SQL语句传递给允许Java代码与设定语言代码交互的方法;通过所述允许Java代码与设定语言代码交互的方法将所述Java代码层次的SQL语句转换为设定语言代码层次的SQL语句并将其传入设定语言代码层次的解析器,以识别所述SQL语句的语法类型,并根据识别的语法类型返回硬件数据库所能适配的格式的语法树;将所述语法树分发至所述硬件数据库,以根据所述语法树执行相应操作并返回设定语言代码层次的执行结果信息;根据设定语言代码层次的执行结果信息返回Java代码层次的执行结果信息至所述JDBC接口,以输出Java代码层次的执行结果信息。以此,能够通过修改JDBC接口的实现层,调用设定语言所支持的方法,在设定语言代码层次与硬件数据库的交互。从JDBC接口请求的SQL查询,得到硬件数据库的查询结果,并返回此查询结果集供JDBC接口获取。用户的应用程序通过调用本发明实施例的硬件数据库的JDBC驱动方法,按照JDBC的标准接口,对硬件数据库的内容进行访问,从而能够使硬件数据库能够服务于Java代码层次的应用程序的用户,高效完成查询与执行操作,起到数据库访问加速的效果。
[0114] 而且,本发明是经过创造性劳动的结果,因为:虽然已有一些修改JDBC接口实现的方法,但其主要关注点是在于分布式处理、虚拟数据库、任务优先级排序等优化方法,其连接数据库的实现方法停留在Java代码层次。此外,分布式处理、虚拟数据库、任务优先级排序等方法中,修改JDBC接口实现的主旨是把查询请求分发给不同主机,实现负载均衡。而不同主机对自身数据库的访问速度,仍然是依赖于主机CPU的计算。当数据量过大时,仅凭借主机CPU的计算,读取数据表的过程将会耗时巨大。因此,现有技术不能给本发明带来启示。
[0115] 在本说明书的描述中,参考术语“一个实施例”、“一个具体实施例”、“一些实施例”、“例如”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。各实施例中涉及的步骤顺序用于示意性说明本发明的实施,其中的步骤顺序不作限定,可根据需要作适当调整。
[0116] 本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0117] 本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0118] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0119] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0120] 以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈