实时数据库与关系数据库数据交换服务的设计与实现
2013-08-18北京首钢自动化信息技术有限公司李亮举刘孟祎
北京首钢自动化信息技术有限公司 李亮举,刘孟祎
现代工业的特点是要求生产全过程的实时监控,高速的实时数据处理,长期的历史数据存储以及生产信息的集成与共享。在工业生产过程中,计算机控制技术已经得到了普及,先进的控制理论和计算机技术相结合更好地解决了生产工艺日益复杂,控制质量要求越来越高的问题。
在实际工业自动化控制过程中需要处理大量的数据,数据变化速度快,并且存在大量非结构化数据(包括图象、声音、视频等)以及半结构化数据。实时数据库的长处在于不需要人工干预,可实时处理大量并发的数据信息;关系数据库可以非常简便地实现对象信息的定义和存储。因此,基于工业自动化控制的需求以及两种数据库各自不同的优势,产生了实时数据库与关系数据库的结合使用,从而产生了两种数据库之间密切频繁地相互通讯。为了解决这一问题,进行了数据交换服务的设计与实现。
1 数据交换服务的基本框架
1.1 数据交换服务的概念和功能
RealTime Database (RTDB)实时数据库是数据库技术发展的一个分支,是数据库技术结合实时处理技术产生的,适用于处理不断更新的快速变化的数据及具有时间限制的事务。实时数据库是开发实时控制系统、数据采集系统等的重要支撑,它有较高的I/O事务吞吐量和高效的数据压缩技术,可以实现实时、高效、可靠的数据存储和查询,同时为用户节省磁盘空间。实时数据库主要应用于工业监控,在实际生产中存储着每个工艺过程点采集到的大量数据。实时数据库也存在缺点,它的存储能力有限。
Relational Database (RDB)是指采用关系模型的关系数据库,是一些相互之间存在一定关联的表的集合。关系数据库的存储能力强,旨在处理永久、稳定的数据,便于企业的生产管理、数据分析以及决策。在工业控制中使用关系数据库对大量历史数据进行存储、管理和分析。但是关系数据库的数据处理速度低,无法对生产过程数据进行及时高效的存储。
数据交换服务管理着不同来源、不同属性的海量数据,为用户提供快捷方便的服务,包括从实时数据库(RTDB)到关系数据库(RDB)的数据转换存储,和关系数据库(RDB)到实时数据库(RTDB)的数据转换存储。数据交换服务为不同数据库之间的互连互通提供了包含加载、转换、传输和存储等操作,可以有效解决数据及时、高效地上传下达,在安全、方便、快捷、顺畅的进行数据交换的同时保证数据的一致性和准确性,实现数据的一次采集、多次分析使用,为各种应用和决策支持提供良好的数据环境。
图1 数据事务处理示意图
1.2 数据交换服务的结构
使用链表可以方便有层次地进行管理和扩展,链表中的每个结点包括数据域和指针域,其中数据域存储数据元素的信息,指针域中存储结点直接后继的存储位置。在数据交换服务中采用三层链表结构如图2所示,将连接connection作为第一级链表,每个连接下的表格table挂接到二级链表上,绑定bind则作为第三级链表。其中:
连接(Connection)链表:list
表(Table)链表:list
绑定(Bind)链表:list
图2 数据交换服务的三层链表结构
由于链表不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构所具有的弱点,但同时也失去了顺序表可随机存取的优点。
2 数据交换服务的关键技术
2.1 数据的读取和存储
在数据交换服务中,转存的单位定义为数据表,用户可以通过客户端定义数据表中需要转存的数据点、数据转存的方向、转存的时间间隔等相关信息。用户可以完成增加、删除和修改数据表等操作。
2.1.1 RTDB的读取和存储
使用冶金过程控制系统开发平台的分布式进程通讯中间件进行RTDB数据的读取和存储。读写过程调用等待接口、请求接口和应答接口。
2.1.2 RDB的读取和存储
RDB的读取和存储采用的是ADO技术。ADO是开发访问OLE数据库应用程序所使用的一种数据库访问组件,是一种可以访问各种数据类型的连接机制,具有容易使用、数据库访问速度高、内存支出少、使用较少的网络流量的优点,其性能和易用性都达到了极佳水平。利用ADO对象并通过ODBC或OLE DB,可以实现对任意数据库的存取和访问,包括SQL Server、Oracle、Access、Excel以及文本文件、图形文件等数据源。
ADO模型包括7个对象,其中主要对象有3个:Connection、Command和 Recordset ,可以被独立创建和释放。此外,还包括其他4个集合对象:Fields、Errors、Parameters和Properties。一个典型的ADO应用程序使用Connection对象建立与数据源的连接,然后使用Command对象给出对数据库操作的命令,如插入数据或者查询数据等,而Recordset用于对结果集进行维护或者浏览等操作。其中Command连接字符串与对应的数据源有关,不同的数据源使用不同的命令,对于关系数据库,通常使用SQL作为命令语言。使用ADO进行RDB读取和存储主要包括以下步骤:
① 初始化COM库,引入ADO库定义文件。
::CoInitialize (NULL);
#import "C:program filescommon filessystemadomsado15.dll"no_namespace rename("EOF", "EndOfFile")
② 用Connection对象连接数据库。
ORACLE数据库的连接字符串为:数据库提供者OraOLEDB.Oracle.1;用户名;密码;数据源oracles; pConn ->Open(连接字符串,用户名,密码,同异步);
SQ LSe rve r数据库的连接字符串为:数据库提供者SQLOLEDB;数据库Database;用户名;密码;数据源127.0.0.1"; 连接:pConn ->Open(连接字符串,用户名,密码,同异步);
③ 利用建立好的连接,通过Command对象执行SQL命令,使用Recordset对象取得结果记录集进行处理、查询,更新数据库。
pCommand->Execute(&vRecordsAffected,NULL,adCmdUnknown );
④关闭连接,释放对象所占的资源。
::CoUninitialize();
2.2 数据类型转换
变体VARIANT数据类型是所有没被显式声明(用如Private、Public 或 Static等语句)为其他类型变量,能够在运行期间动态改变类型的数据类型。变体能支持所有简单的数据类型,如整型、浮点型、字符串、布尔型、日期时间、货币等。数值数据为负数时范围从-1.797693134862315E308 到-4.94066E-324,正数时则从4.94066E-324 到 1.797693134862315E308。
可以用 Variant 数据类型来替换各种数据类型,有很强的适应性。通常,数值Variant 数据保持为其Variant中原来的数据类型。例如,算术运算是针对含Byte、Integer、Long或 Single 之一的Variant执行的,如果把一个Integer赋值给Variant,则接下来的运算会把此Variant当成Integer来处理,但是当运算结果超过原来数据类型的正常范围时,存在Variant中的结果会被提升到能表示较大数据范围的数据类型。如 Byte 则提升到Integer,Integer 则提升到Long,而Long和Single则提升为Double。当Variant变量中有Decimal及Double值超过它们各自的范围时,则会发生错误。
Variant数据结构包含两个域,第一个是vt域,定义成各种类型的数据成员构成的联合体,它决定着第二个域的数据类型;第二个域是一个用来指明联合体中目前起作用的数据类型的变量,名称随着vt域中输入值的不同而改变。变体接收到的数据存储在联合体的某个数据成员中。例如:当一个long型数据存入Variant类型时,vt域类型为VT_I4,其第二个域使用的名称是lVal。对Variant变量的赋值方法:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值。例如:variant v; int a=2013; v.vt=VT_I4; v.lVal=a。
2.2.1 实时数据库到ORACLE、SQLServer关系数据库转换
从实时数据库读出来数据,存入关系数据库之前先把数据转换成变体类型,再将变体类型存入关系数据库。存入关系数据库的数据类型和从数据库取出的变体类型是有确定的对应关系的,具体关系如表1和表2所示:
表1 ORACLE数据类型和变体类型对应关系
表2 SQLServer数据类型和变体类型对应关系
一些VARIANT支持的类型如VT_I2(short整型)、VT_UI2(unsigned short无符号整型)、VT_UI4(unsigned long 无符号长整型)可以直接定义,但是无法从ORACLE或者SQLServer关系数据库中取出这些类型的数据。
在数据交换服务的类型转换过程中,进行了严格的类型匹配检查以及合法转换的数值范围检查,如果不符合要求则为非法转换,服务会报错提示类型转换失败,需要用户重新设置数据类型。
例如RTDB的XT_XCHAR类型转换到RDB的NUMBER类型时,需要做以下检查:
①字符串是否已初始化,如果未初始化则报错提示用户需要先进行初始化操作。
②从字符串到数字类型转换首位是否为数字或者符号位的检查,如果首位不是数字或者符号位,则转换是非法的,服务报错。
③首位之外的其他位是否为数字或者小数点的检查,不是数字或者小数点则是非法转换,服务报错。
④末位是否为数字的检查,不是数字则是非法转换,报错。
2.2.2 ORACLE、SQLServer关系数据库到实时数据库转换
从关系数据库取出变体类型的数据,进行数据类型转换,再存入实时数据库。在类型转换时,同样需要进行严格的类型匹配检查以及合法转换的数值范围检查。
例如:RDB的 VT_I2类型到RTDB的XT_UI2类型转换时,需要合法转换数值范围的检查。Int的数据范围是-32768~32767,unsigned int的数据范围是0~65535。因此当需要转换的数值处于[-32768,0)时,服务会报错提示转换非法。
数据类型转换的分支很多,分支总个数是实时数据库数据类型的个数与关系数据库数据类型个数的笛卡尔积,而在每个分支中的类型匹配检查个数以及合法转换数值范围检查个数则更为庞大,十分复杂。
3 应用情况
数据交换服务开发完成后首先应用到了冶金过程控制系统开发平台的数据平台中。数据平台涉及到大量的数据采集、分析计算处理和数据存储转换,数据交换服务能够很好地完成其中的数据读取、存储和转换功能,转换存储效率较高,功能良好。该服务在自动控制系统中可以对现场收集到的数据进行出色地处理,满足工业现场的需要。
4 结论
数据交换服务是工业自动化信息化发展过程中自动控制系统的一个重要组成部分,该服务运行稳定,可以快速而准确地提供实时数据库和关系数据库之间数据的加载、转换、传输和存储服务,在解决数据共享上发挥着重要作用,有利于对现有数据资源进行重新整合,充分发掘数据资源的潜在价值,满足了不同业务的协同需求。
[1]李亮举, 彭会军. 冶金过程控制开发平台中进程通信系统的开发及应用[J]. 首钢科技. 2011,11: 12-16.
[2]David Sceppa著, 石钧, 葛俊译. ADO编程技术[M]. 清华大学出版社, 2001.
[3]严蔚敏, 吴伟民著. 数据结构[M]. 清华大学出版社, 2005.
[4]王海亮, 张利民, 王海凤, 郑建茹等著. 精通Oracle 10g[M]. 中国水利水电出版社, 2005.
[5]Raphael Pender著, 苏剑等译. 标准C++编程宝典[M].电子工业出版社,2001.