发明内容
本发明的目的是提供一种基于统一接口的内存数据库分布式访问方法,使用统一接口提供本地和远程访问功能,并进行透明数据交换,以解决异构机之间内存数据库的数据转换问题。
本发明的另一目的是提供一种基于统一接口的内存数据库分布式访问系统,以实现异构机之间内存数据库的数据转换。
本发明的基于统一接口的内存数据库分布式访问方法包括以下步骤:
在客户机上装设面向对象类内存数据库接口rtdbintf模块,通过该模块访问本地内存数据库或服务器内存数据库;
在主、备服务器上运行代理服务rtdbproxy模块;
若应用程序访问本地内存数据库,rtdbintf模块将通过内存数据库API直接访问本机上的内存数据库;
若应用程序访问远程服务器的内存数据库,则rtdbintf模块和主服务器rtdbproxy模块通过Socket建立TCP/IP连接,rtdbintf模块将访问请求封装成协议包,发送给主服务器的rtdbproxy模块,该rtdbproxy模块能够获取服务器的主备角色信息、解析收到的报文、访问服务器内存数据库,再返回执行结果;
rtdbintf模块和rtdbproxy模块使用RTDB*NET通信协议交换所在主机的体系结构信息(即内存布局)和服务器的主备角色信息。
在rtdbintf模块向rtdbproxy模块发送访问请求和接收到来自rtdbproxy模块的返回信息时,要根据服务器和客户机体系结构的异同选择是否进行相应的字节顺序转换,如果服务器和客户机体系结构不同,则rtdbintf模块将整型数据、浮点型数据的内存字节顺序颠倒。
rtdbintf模块接到rtdbproxy模块返回的信息时,检查服务器的主备角色是否发生变化,如果有变化就将活动连接主动切换到新的主服务器上。
在应用程序调用rtdbintf接口模块建立和rtdbproxy模块连接时,需要同时指定主备服务器的IP地址和rtdbproxy的服务端口号。
本发明的基于统一接口的内存数据库分布式访问系统包括客户机和主备服务器,所述客户机中包括面向对象类内存数据库接口rtdbintf模块、本地内存数据库和应用程序模块,所述主备服务器中分别包括代理服务rtdbproxy模块和服务器内存数据库,所述应用程序模块通过所述rtdbintf模块直接调用内存数据库API来访问本地内存数据库,或通过rtdbproxy访问远程服务器内存数据库,rtdbintf模块和rtdbproxy模块通过socket建立TCP/IP连接,使用RTDB*NET通信协议交换数据。
所述rtdbintf模块包括连接接口、数据库接口、查询接口、表结构信息接口和字段信息接口,通过使用该组接口,用户可以任意选择访问本地还是服务器内存数据库。
本发明的基于统一接口的内存数据库分布式访问方法,使用了统一的接口提供分布式内存数据库访问并进行透明数据交换,解决了异构机之间的内存数据库数据转换问题,通信协议对应用程序透明并支持主备冗余机制,采用类商用数据库的接口体系,降低开发人员的学习曲线。
本发明的基于统一接口的内存数据库分布式访问系统中,客户机与主备服务器中分别装设rtdbinft模块和rtdbproxy模块,使得异构机之间基于统一接口的内存数据库中数据交换成为可能。
具体实施方式
本发明针对现有内存数据库系统只提供本地访问接口,而不适应当前系统分布式部署需求的现实,并且考虑到现有SCADA(Supervisory Control And Data Acquisition)系统分布式部署时,应用服务器和操作员工作站CPU体系结构的差异(即数据在内存中存储的字节顺序不一致),SCADA系统实时库服务器采用主备机配置时,客户端只有访问主服务器才能获得有效数据的需要,摒弃了现有内存数据库通常使用的专用的C语言API接口,采用大多数C++程序员熟悉的类接口,提供面向对象的类商用数据库访问接口rtdbintf模块,能进行分布式内存数据库访问、数据透明转换、主备服务器透明切换的内存数据库访问方法及系统。具体实施例如下:
一、基于统一接口的内存数据库分布式访问方法步骤如下:
(1)在客户机上装设面向对象类内存数据库接口rtdbintf模块,通过该模块可以访问本地内存数据库或服务器内存数据库;
(2)在主、备服务器上运行代理服务rtdbproxy模块;
(3)若应用程序访问本地内存数据库,rtdbintf模块将通过内存数据库API直接访问本机上的内存数据库;
若应用程序访问远程服务器内存数据库,则rtdbintf模块和主服务器的rtdbproxy模块通过Socket建立TCP/IP连接,rtdbintf模块将访问请求封装成协议包,该访问请求中需指定主备服务器的IP地址和rtdbproxy的服务端口号,将该协议包发送给主服务器的rtdbproxy模块,该rtdbproxy模块能够获取主备角色信息、解析收到的报文、访问服务器内存数据库,再返回执行结果;
(4)rtdbintf模块和rtdbproxy模块建立连接时,同时交换所在主机的体系结构信息(即内存布局)和服务器的主备信息。
(5)在rtdbintf模块向主服务器rtdbproxy模块发送访问请求时以及接收到来自rtdbproxy模块的返回信息时,要根据服务器和客户机体系结构的异同选择是否进行相应的字节顺序转换,如果服务器和客户机体系结构不同,则rtdbintf模块将整型数据、浮点型数据的内存字节顺序颠倒。
(6)rtdbintf模块接到主服务器rtdbproxy模块返回的信息时,检查服务器的主备角色是否发生变化,如果有变化就将活动连接主动切换到新的主服务器上。
RTDB*NET通信协议是一个请求应答式协议,主要包括连接建立、数据库结构信息查询、表结构信息查询、字段结构信息查询、记录查询、读字段、写字段、断开连接几个部分。
如图1所示,为本发明提出的一种rtdbintf接口模块调用关系流程示意图,包括以下步骤:
(1)应用程序调用rtdbintf接口模块的动态库导出的CreateRtdbConnection方法获得IRTDBConnection连接接口,该连接接口具有设置连接参数、建立数据库连接等功能。
(2)通过IRTDBConnection的GetDatabase方法获得IRTDBDatabase数据库接口,该接口具有打开指定内存数据库库、查询当前数据库包含表的个数及名字等功能。
(3)通过IRTDBDatabase数据库接口的GetQuery方法得到IRTDBQuery查询接口对象,该接口具有条件查询、遍历结果集、读写字段值等功能。
(4)通过IRTDBDatabase数据库接口的GetTableSchema方法得到IRTDBTableSchema表结构信息接口对象,该接口具有查询当前表定义信息功能,如表名称、表包含的字段个数及名字等。
(5)通过IRTDBTableSchema表结构信息接口的GetFieldSchema方法得到IRTDBFieldSchema字段信息接口对象,该接口具有查询当前字段定义信息的功能,如字段名称、字段类型、字段长度等。
其中,应用程序通过rtdbintf接口模块访问本地内存数据库的实现方式与传统内存数据库访问方法一致,不再详述。
如图2所示,为本发明提出的一种应用程序访问远程服务器内存数据库情形的示意图,实现过程包括以下几点:
1,应用程序模块在调用rtdbintf模块中的IRTDBConnection连接接口建立连接时,需要同时指定主备服务器的IP地址和rtdbproxy的服务端口号,本发明支持网络冗余,即一台服务器可以指定多个IP地址。
2,IRTDBConnection连接接口向主服务器中rtdbproxy模块发送连接请求,交换连接信息。
连接请求报文
名称 |
类型 |
长度 |
备注 |
主机字节顺序 |
unsigned int |
4 |
客户机的主机字节顺序 |
协议版本号 |
unsigned char |
1 |
rtdbintf模块通信协议版本 |
2)连接响应报文
名称 |
类型 |
长度 |
备注 |
主机字节顺序 |
unsigned int |
4 |
服务器的主机字节顺序 |
服务句柄 |
int |
4 |
rtdbproxy启动时产生的随机数 |
协议版本号 |
unsigned char |
1 |
rtdbproxy模块通信协议版本 |
rtdbintf接口模块根据rtdbproxy返回的报文确定通信协议版本是否相容及是否需要转换字节顺序。具体地,如果服务器和客户机体系结构相同,则不做任何转换;如果服务器和客户机体系结构不同,则rtdbintf模块负责将整型数据、浮点型数据的内存字节顺序颠倒,即将第一个字节的内容与最后一个字节的内容互换、将第二个字节的内容与倒数第二个字节的内容互换,依次类推。
rtdbintf还可以通过rtdbproxy的服务句柄知道当前连接的rtdbproxy是否重新启动过,据此判断是否需要更新自己缓存的信息。
3,所有的通信都使用统一的报文头。
公共请求报文头
rtdbproxy根据报文类型解析报文,执行相应的操作并返回给rtdbintf。
名称 |
类型 |
长度 |
备注 |
报文长度 |
unsigned int |
4 |
当前报文长度 |
报文类型 |
unsigned char |
1 |
当前报文类型 |
2)公共响应报文头
名称 |
类型 |
长度 |
备注 |
状态码 |
unsigned int |
4 |
请求执行的结果状态码 |
报文长度 |
int |
4 |
当前报文长度 |
角色信息 |
unsigned int |
4 |
rtdbproxy的主备状态 |
名称 |
类型 |
长度 |
备注 |
报文类型 |
unsigned char |
1 |
报文类型 |
rtdbintf根据响应报文判断请求是否得到正确执行,并可以判断rtdbproxy的主备状态是否发生改变,如果没有变化继续执行。如果发生改变,则将活动连接切换到另一台服务器上。
二、基于统一接口的内存数据库分布式访问系统包括客户机和主、备服务器,所述客户机中包括面向对象类内存数据库接口rtdbintf模块、本地内存数据库和应用程序模块,所述主、备服务器中包括代理服务rtdbproxy模块和服务器内存数据库,应用程序模块通过所述rtdbintf模块可以直接调用内存数据库API来访问本地内存数据库,或通过rtdbintf模块和rtdbproxy模块访问远程服务器内存数据库,rtdbintf模块和rtdbproxy模块通过socket建立TCP/IP连接,使用通信协议RTDB*NET交换数据,所述rtdbintf模块包括IRTDBConnection连接接口、IRTDBDatabase数据库接口、IRTDBQuery查询接口、IRTDBTableSchema表结构信息接口和IRTDBFieldSchema字段信息接口,通过使用该同组接口,用户可以任意选择访问本地还是服务器内存数据库。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视本发明的保护范围。
本发明使用统一的接口提供分布式内存数据库问并进行透明数据交换,解决了异构机之间的内存数据库数据转换问题,通信协议对应用程序透明并支持主备冗余机制,采用类商用数据库的接口体系,降低开发人员的学习曲线。