一种内存数据库高效远程访问方法

xiaoxiao2020-10-23  11

一种内存数据库高效远程访问方法
【技术领域】
[0001] 本发明涉及信息通信与数据库领域,具体而言涉及一种内存数据库高效远程访问 的实现方法。
【背景技术】
[0002] 在现有的信息系统中,使用传统数据库常常因为硬盘I/O读写速率的影响而导致 信息系统的性能遇到瓶颈。
[0003] 内存数据库因为读写都在内存中进行,因此可以突破硬盘I/O读写的限制而提升 信息系统的性能,一般读写速度是普通硬盘数据库的10倍以上。
[0004] 基于上述现状,现有技术中开发了支持传统SQL语句内存数据库。
[0005] 但随着而来引发了新的问题,目前很多系统是分布式或网格的,若该系统使用内 存数据库,必须保证各个节点的内存数据库数据保持一致。另外,目前有些系统对内存数据 进行备份,增加系统可靠性。
[0006] 这些要求无疑加大系统开发的难度和风险。最好的解决方法是让多个节点访问统 一个内存数据库,确保系统数据一致。
[0007]目前现有的实践中存在一些内存数据库远程访问的组件产品,但采用的技术无法 发挥内存数据库高效的性能。

【发明内容】

[0008] 本发明目的在于提供一种内存数据库高效远程访问方法,利用该方法不但可以让 多台主机访问内存数据库,还可以充分发挥内存数据库性能。
[0009] 本发明的上述目的通过独立权利要求的技术特征实现,从属权利要求以另选或有 利的方式发展独立权利要求的技术特征。
[0010] 为达成上述目的,本发明提出一种内存数据库高效远程访问方法,包括:
[0011] 在同一台主机上部署组件GSProxy服务端以及内存数据库,该组件GSProxy服务 端提供启动组件的脚本文件或可执行文件,在启动组件GSProxy服务端时,组件GSProxy服 务端通过内存数据库提供的C-API启动内存数据库;
[0012] 用户机上部署组件GSProxy客户端,用户可通过该GSProxy客户端提供的统一接 口远程访问GSProxy服务端的内存数据库;
[0013] 当GSProxy服务端监听到GSProxy客户端发起的连接请求时,服务端分配线程提 供客户端与内存数据库的连接与访问,其中,一个客户端同时只能连接一个数据库;
[0014]GSProxy客户端在连接成功后向GSProxy服务端发起对内存数据库的操作请求, GSProxy服务端的桥接模块在接收到请求,向GSProxy客户端返回成功接收请求响应;
[0015]GSProxy服务端对GSProxy客户端发起的操作命令进行调度:当GSProxy客户端 对内存数据库发起新增、删除、查询、修改操作时,对交互线程加互斥锁并归入消息队列进 行统一调度,使各个GSProxy客户端对内存数据库操作的原子性;当消息队列有消息时,通 过消息队列调度操作线程按照一定的优先级将调度消息提交至消息下发模块;消息下发模 块将GSProxy客户端提交的消息请求通过内存数据库提供的C-API接口提交至内存数据 库,并将操作结果返回给GSProxy客户端。
[0016] 进一步的例子中,前述GSProxy服务端根据GSProxy客户端的连接请求分配线 程提供客户端与内存数据库的连接与访问时,通过GSProxy服务端的桥接模块监听与 GSProxy客户端的连接,当与GSProxy客户端进行三次通信握手后,从线程池中获取空闲线 程与GSProxy客户端保持长连接,并向GSProxy客户端返回连接结果。
[0017] 进一步的例子中,前述GSProxy服务端根据GSProxy客户端的连接请求分配线程 提供客户端与内存数据库的连接与访问时,所述的空闲线程采用Socket通信方式保持与 GSProxy客户端的长连接,该连接通过TCP/IP协议内置的keepalive机制检测GSProxy客 户端是否在线,并且当发送的心跳包超过三次未连接时,释放连接以及将线程归于线程池。
[0018] 进一步的例子中,前述消息队列调度操作线程按照下述优先级将调度消息提交至 消息下发模块:
[0019] 1、查询操作优先级大于增加、删除、修改优先级;
[0020] 2、新增、删除、修改操作优先级大于事务提交和回滚优先级。
[0021] 进一步的例子中,在上述优先级调度基础上,GSProxy服务端在内存数据库中生成 一张表用于记录各个GSProxy客户端提交的操作请求的历史记录,表结构如下:
[0023] 当GSProxy客户端提交时操作请求时,解析操作请求并将该操作请求记录到前述 表中,GSProxy服务端预测该GSProxy客户端下两次提交该类型操作的时间点,根据预测的 时间点先后顺序排列各个GSProxy客户端操作请求调度先后顺序,以保证响应时间符合客 户感知习惯,其中前述的预测采用灰色预测模型GM(1,1)对GSProxy客户端即将提交时间 点进行预测。
[0024] 进一步的例子中,前述GSProxy服务端在启动时,创建默认创建20个闲置线程,这 些闲置线程被用于GSProxy客户端连接和访问内存数据时使用,当GSProxy客户端连接服 务端时,一个闲置线程将被激活,该线程实现GSProxy客户端和GSProxy服务端之间的消息 交互,当GSProxy客户端断开服务端时,所使用的线程将被重新挂起。
[0025] 本发明所提出的内存数据库高效远程访问方法,能够使内存数据库具有远程访 问,而尽可能发挥内存数据库高效的性能,有效支持了网格或分布式小范围使用内存数据 库的情况。而且能够使多用户并发访问和操作,同时通过调度规则让用户在感知上"高效", 增加用户产品体验。利用本发明的方法,使主机的内存数据在其他主机实现热备份,增加系 统的可靠性。
[0026] 应当理解,前述构思以及在下面更加详细地描述的额外构思的所有组合只要在这 样的构思不相互矛盾的情况下都可以被视为本公开的发明主题的一部分。另外,所要求保 护的主题的所有组合都被视为本公开的发明主题的一部分。
[0027] 结合附图从下面的描述中可以更加全面地理解本发明教导的前述和其他方面、实 施例和特征。本发明的其他附加方面例如示例性实施方式的特征和/或有益效果将在下面 的描述中显见,或通过根据本发明教导的【具体实施方式】的实践中得知。
【附图说明】
[0028] 附图不意在按比例绘制。在附图中,在各个图中示出的每个相同或近似相同的组 成部分可以用相同的标号表示。为了清晰起见,在每个图中,并非每个组成部分均被标记。 现在,将通过例子并参考附图来描述本发明的各个方面的实施例,其中:
[0029] 图1为本发明一实施方式嵌入式内存数据库的实现方法的流程示意图。
[0030] 图2为线程池架构示意图。
[0031] 图3为内存数据库的数据调度示意图。
[0032] 图4为利用图1实施例的方法所实现内存数据库高效远程访问的流程图。
【具体实施方式】
[0033] 为了更了解本发明的技术内容,特举具体实施例并配合所附图式说明如下。
[0034] 在本公开中参照附图来描述本发明的各方面,附图中示出了许多说明的实施例。 本公开的实施例不必定意在包括本发明的所有方面。应当理解,上面介绍的多种构思和 实施例,以及下面更加详细地描述的那些构思和实施方式可以以很多方式中任意一种来实 施,这是因为本发明所公开的构思和实施例并不限于任何实施方式。另外,本发明公开的一 些方面可以单独使用,或者与本发明公开的其他方面的任何适当组合来使用。
[0035] 结合图1、图2、图3和图4,根据本发明的实施例,一种内存数据库高效远程访问方 法,包括:
[0036] 在同一台主机上部署组件GSProxy服务端以及内存数据库,该组件GSProxy服务 端提供启动组件的脚本文件或可执行文件,在启动组件GSProxy服务端时,组 件GSProxy服 务端通过内存数据库提供的C-API启动内存数据库;
[0037] 用户机上部署组件GSProxy客户端,用户可通过该GSProxy客户端提供的统一接 口远程访问GSProxy服务端的内存数据库;
[0038] 当GSProxy服务端监听到GSProxy客户端发起的连接请求时,服务端分配线程提 供客户端与内存数据库的连接与访问,其中,一个客户端同时只能连接一个数据库;
[0039]GSProxy客户端在连接成功后向GSProxy服务端发起对内存数据库的操作请求, GSProxy服务端的桥接模块在接收到请求,向GSProxy客户端返回成功接收请求响应;
[0040]GSProxy服务端对GSProxy客户端发起的操作命令进行调度:当GSProxy客户端 对内存数据库发起新增、删除、查询、修改操作时,对交互线程加互斥锁并归入消息队列进 行统一调度,使各个GSProxy客户端对内存数据库操作的原子性;当消息队列有消息时,通 过消息队列调度操作线程按照一定的优先级将调度消息提交至消息下发模块;消息下发模 块将GSProxy客户端提交的消息请求通过内存数据库提供的C-API接口提交至内存数据 库,并将操作结果返回给GSProxy客户端。
[0041 ]本例中,组件GSProxy包括GSProxy客户端和GSProxy服务端。
[0042] 提供GSProxy客户端发起连接请求的C-API如下:
[0043] 1)int ConnectDB(string DBName)
[0044] 功能:连接内存数据库指定的库;
[0045] 参数:DBName,内存数据库中的库名;
[0046] 其中连接指定数据库发送请求报文结构体如下:
[0048]接收报文结构体如下:
[0050] 值得一提的是:当连接数据库名DBName为空字符串时,表示将连接内存数据库中 默认的库。
[0051] 在本实施例中,客户端模块提供以下2类C-API接口。
[0052] 1)bool ExecStatement(char*sz_SQL)
[0053] 功能:执行SQL语句;
[0054] 参数:sz_SQL,标准SQL执行语句字符串;执行操作包括新建数据表和删除数据表 以及新增、查询、修改、删除记录操作。
[0055] 2)bool Get_DATA(char*sz_SQL, char*Data)
[0056] 功能:执行查询语句并返回查询成功;
[0057] 参数:sz_SQL,标准SQL查询语句字符串;Data,返回的查询结果;
[0058] 查询结果采用XML格式字符串流返回,具体格式样例如下。
[0059] 例如,数据库结果集如下时:

[0061] 输出的查询结果集如下:
[0062] 〈Result〉
[0063] 〈Row id=l>〈col>3〈/col>〈col>'火炮'</col>〈/Row>
[0064] 〈Row id=2>〈col>5〈/col>〈col>'装甲'</col>〈/Row>
[0065] 〈/Result〉
[0066] 客户端可以通过解析XML格式的获取记录集的内容。
[0067] 通过查询语句查询表只能获取查询结果集前10行记录,客户端可以通过查询语 句获取制定范围的结果集。具体如下:
[0068] SELECT*FROM table LIMIT 5, 10;// 返回第6行到第15行的记录
[0069] 在本实施例中,客户端通过通信报文对内存数据库操作。具体报文格式如下。
[0070] 1、查询表记录
[0071] 查询表记录发送请求报文的结构体如下所示:
[0073] 说明:当连接数据库名DBName为空字符串时,表示将连接内存数据库中默认的 库。
[0074] 接收报文结构体如下:
[0076] 2、DDL(新增表和查询表以及新增、修改、删除表记录)操作
[0077] 新增、修改、删除表记录请求报文结构体如下所示。
[0078]
[0079] 说明:当连接数据库名DBName为空字符串时,表示将连接内存数据库中默认的 库。
[0080] 接收报文结构体如下:
[0083] 在本实施例中,GSProxy组件支持多个数据库连接是采用线程池支持的。如图2所 示,线程池是实现内存数据库远程多个终端并发访问的重要方式,它允许一个或多个客户 端并发访问内存数据库。线程池是在组件GSProxy服务端启动时创建的,创建默认创建20 个闲置线程。闲置线程用于客户端连接和访问内存数据,当客户端连接服务端时,一个闲置 线程将被激活,该线程实现客户端和服务端之间的消息交互,当客户端断开服务端时,所使 用的线程将被重新挂起。因此闲置线程的数量也决定可支持多个客户端连接的数量,该数 量可以通过配置文件进行配置。
[0084] 由于GSProxy客户端的消息请求和处理方式与现有技术中的C/S架构客户端相 同,在本发明的以下内容中将不再赘述,主要描述组件GSProxy服务端的架构和消息处理 流程。
[0085] 如图3所示,GSProxy服务端的主要作用是提供的统一接口远程访问和操作服务 端的内存数据库,实现与GSProxy客户端的长连接以及GSProxy客户端对内存数据库操作 命令的调度。
[0086] 组件GSProxy分为客户端和服务端,用户通过GSProxy客户端提供的统一接口远 程访问服务端的内存数据库。该方法是基于TCP/IP的常连接进行数据远程访问,减少因反 复连接而造成的性能消耗。
[0087] 结合图3, GSProxy服务端包括客户端桥接、消息调度以及命令下发模块。
[0088] 1)桥接模块
[0089] 客户端桥接模块是用于监听客户端的连接。当客户端向服务端发起连接请求时, 该模块从线程池获取线程,通过该线程采用Socket通信方式保持与客户端的长连接。该连 接通过TCP/IP协议内置的keepalive机制检测客户端是否在线。当发送的心跳包超过三 次没连接,将释放连接以及将线程归于线程池。
[0090] 也就是说,在对内存数据库进行访问,前述GSProxy服务端根据GSProxy客户端的 连接请求分配线程提供客户端与内存数据库的连接与访问时,通过GSProxy服务端的桥接 模块监听与GSProxy客户端的连接,当与GSProxy客户端进行三次通信握手后,从线程池中 获取空闲线程与GSProxy客户端保持长连接,并向GSProxy客户端返回连接结果。
[0091] 优选的是,前述GSProxy服务端根据GSProxy客户端的连接请求分配线程提供客 户端与内存数据库的连接与访问时,所述的空闲线程采用Socket通信方式保持与GSProxy 客户端的长连接,该连接通过TCP/IP协议内置的keepalive机制检测GSProxy客户端是否 在线,并且当发送的心跳包超过三次未连接时,释放连接以及将线程归于线程池。
[0092] 2)消息调度模块
[0093] 消息调度模块是用于对GSProxy客户端发起的操作命令进行调度。
[0094] 当GSProxy客户端对内存数据库发起新增、删除、查询、修改操作时,该模块对交 互线程加互斥锁并归入消息队列进行统一调度,使各个GSProxy客户端对内存数据库操作 的原子性。通过消息队列调度操作线程实现各个GSProxy客户端对内存数据库的操作的调 度。
[0095] 前述调度顺序并非是先申请先执行的原则,而是尽可能让发起请求的用户尽快接 收到相应。 [0096] 优选地,前述消息队列调度操作线程按照下述优先级将调度消息提交至消息下发 模块:
[0097] 1、查询操作优先级大于增加、删除、修改优先级;
[0098] 2、新增、删除、修改操作优先级大于事务提交和回滚优先级。
[0099] 在上述优先级调度基础上,相同操作类型之前是根据各个客户端提交的操作请求 历史记录预测后续提交操作请求的时间点,按照预测时间点进行先后顺序排列。具体实现 如下。
[0100] GSProxy服务端在内存数据库中生成一张表用于记录各个GSProxy客户端提交的 操作请求的历史记录,表结构如下:
[0102] 当GSProxy客户端提交时操作请求时,解析操作请求并将该操作请求记录到前述 表中,GSProxy服务端预测该GSProxy客户端下两次提交该类型操作的时间点,根据预测的 时间点先后顺序排列各个GSProxy客户端操作请求调度先后顺序,以保证响应时间符合客 户感知习惯,其中前述的预测采用灰色预测模型GM(1,1)对GSProxy客户端即将提交时间 点进行预测。
[0103] 预测算法是在服务器空闲时段内进行的即预测算法的线程会等待服务端所有任 务进行处于完成或阻赛等待状态才会进行,尽量不影响服务端本身的性能。
[0104] 3)消息下发模块
[0105] 消息下发模块用于将GSProxy客户端提交的消息请求通过内存数据库提供的 C-API提交至内存数据库,并将操作结果返回给GSProxy客户端。
[0106] 结合图4所示,在本实施例中,组件GSProxy服务端处理GSProxy客户端的操作请 求的流程具体步骤如下所示。
[0107] 步骤一响应客户端连接。客户端向服务端发起连接,服务端的桥接模块在与客户 端进行三次通信握手后,从线程池中分配空闲线程与客户端保持长连接,并向客户端返回 连接结果。
[0108] 步骤二响应客户端操作请求。客户端在连接成功后向服务端发起对内存数据库的 操作请求,服务端的桥接模块在接收到请求,向客户端返回成功接收请求响应。
[0109] 步骤三线程归入消息队列。当客户端提交操作请求后,消息调度模块将交互线程 加互斥锁并归入消息队列进行统一调度。
[0110] 步骤四通过调度规则调度消息队列。当消息队列有消息时,消息调度模块按照上 述优先级规则调度消息提交至消息下发模块。
[0111] 步骤五提交操作请求至内存数据库。当消息下发模块收到消息后,会直接将请求 的操作提交至内存数据库,并将操作结果返回至客户端。
[0112] 虽然本发明已以较佳实施例揭露如上,然其并非用以限定本发明。本发明所属技 术领域中具有通常知识者,在不脱离本发明的精神和范围内,当可作各种的更动与润饰。因 此,本发明的保护范围当视权利要求书所界定者为准。
【主权项】
1. 一种内存数据库高效远程访问方法,其特征在于,包括: 在同一台主机上部署组件GSProxy服务端以及内存数据库,该组件GSProxy服务端提 供启动组件的脚本文件或可执行文件,在启动组件GSProxy服务端时,组件GSProxy服务端 通过内存数据库提供的C-API启动内存数据库; 用户机上部署组件GSProxy客户端,用户可通过该GSProxy客户端提供的统一接口远 程访问GSProxy服务端的内存数据库; 当GSProxy服务端监听到GSProxy客户端发起的连接请求时,服务端分配线程提供客 户端与内存数据库的连接与访问,其中,一个客户端同时只能连接一个数据库; GSProxy客户端在连接成功后向GSProxy服务端发起对内存数据库的操作请求, GSProxy服务端的桥接模块在接收到请求,向GSProxy客户端返回成功接收请求响应; GSProxy服务端对GSProxy客户端发起的操作命令进行调度:当GSProxy客户端对内 存数据库发起新增、删除、查询、修改操作时,对交互线程加互斥锁并归入消息队列进行统 一调度,使各个GSProxy客户端对内存数据库操作的原子性;当消息队列有消息时,通过消 息队列调度操作线程按照一定的优先级将调度消息提交至消息下发模块;消息下发模块将 GSProxy客户端提交的消息请求通过内存数据库提供的C-API接口提交至内存数据库,并 将操作结果返回给GSProxy客户端。2. 根据权利要求1所述的内存数据库高效远程访问方法,其特征在于,前述GSProxy服 务端根据GSProxy客户端的连接请求分配线程提供客户端与内存数据库的连接与访问时, 通过GSProxy服务端的桥接模块监听与GSProxy客户端的连接,当与GSProxy客户端进行 三次通信握手后,从线程池中获取空闲线程与GSProxy客户端保持长连接,并向GSProxy客 户端返回连接结果。3. 根据权利要求2所述的内存数据库高效远程访问方法,其特征在于,前述GSProxy服 务端根据GSProxy客户端的连接请求分配线程提供客户端与内存数据库的连接与访问时, 所述的空闲线程采用Socket通信方式保持与GSProxy客户端的长连接,该连接通过TCP/IP 协议内置的keepalive机制检测GSProxy客户端是否在线,并且当发送的心跳包超过三次 未连接时,释放连接以及将线程归于线程池。4. 根据权利要求1所述的内存数据库高效远程访问方法,其特征在于,前述消息队列 调度操作线程按照下述优先级将调度消息提交至消息下发模块: 1) 查询操作优先级大于增加、删除、修改优先级; 2) 新增、删除、修改操作优先级大于事务提交和回滚优先级。5. 根据权利要求5所述的内存数据库高效远程访问方法,其特征在于,在上述优先级 调度基础上,GSProxy服务端在内存数据库中生成一张表用于记录各个GSProxy客户端提 交的操作请求的历史记录,表结构如下:当GSProxy客户端提交时操作请求时,解析操作请求并将该操作请求记录到前述表 中,GSProxy服务端预测该GSProxy客户端下两次提交该类型操作的时间点,根据预测的时 间点先后顺序排列各个GSProxy客户端操作请求调度先后顺序,以保证响应时间符合客户 感知习惯,其中前述的预测采用灰色预测模型GM(1,1)对GSProxy客户端即将提交时间点 进行预测。6.根据权利要求1所述的内存数据库高效远程访问方法,其特征在于,前述GSProxy服 务端在启动时,创建默认创建20个闲置线程,这些闲置线程被用于GSProxy客户端连接和 访问内存数据时使用,当GSProxy客户端连接服务端时,一个闲置线程将被激活,该线程实 现GSProxy客户端和GSProxy服务端之间的消息交互,当GSProxy客户端断开服务端时,所 使用的线程将被重新挂起。
【专利摘要】本发明提供一种内存数据库高效远程访问方法,包括:在同一台主机上部署组件GSProxy服务端以及内存数据库,在启动组件GSProxy服务端时,组件GSProxy服务端通过内存数据库提供的C-API启动内存数据库;用户机上部署组件GSProxy客户端;当GSProxy服务端监听到GSProxy客户端发起的连接请求时,服务端分配线程提供客户端与内存数据库的连接与访;GSProxy客户端在连接成功后向GSProxy服务端发起对内存数据库的操作请求,GSProxy服务端的桥接模块在接收到请求,向GSProxy客户端返回成功接收请求响应;GSProxy服务端对GSProxy客户端发起的操作命令进行调度,将GSProxy客户端提交的消息请求通过内存数据库提供的C-API接口提交至内存数据库,并将操作结果返回给GSProxy客户端。
【IPC分类】G06F17/30, G06F9/44
【公开号】CN104899274
【申请号】CN201510280435
【发明人】杨庆磊, 欧阳磊, 刘沾沾, 曹山
【申请人】北方信息控制集团有限公司
【公开日】2015年9月9日
【申请日】2015年5月27日

最新回复(0)