数据访问工具 DAF 中 ResourceIDService 服务的接口 设计与实现

http://www.paper.edu.cn
- 1 -
数据访问工具 DAF 中 ResourceIDService 服务的接口
设计与实现
服务的接口
设计与实现
陶昕,高锦标
华东交通大学信息工程学院,南昌(330013)
E-mail:[email protected]
摘 要:ResourceID 是 64 位整型数据,是用来定位能量系统中唯一性资源的标识,
ResourceIDService 服务是 Data Access Facility 规范简称为 DAF 中的一个重要服务接口,提
供了 ResourceID 和文本形式 URI(Uniform Resource Identifier)相互转化的方法,保证了
ResourceID 的正确解析, 所以设计与实现该接口对于资源的访问带来的极大的便利性、 高效
性。
关健词:数据访问工具;通用组件接口;61970 系列标准;公用数据模型
1. 引言
在 EMS 中,目前,IEC61970 中的 CIM 模型已被 ABB、Alston、Siemens 等 20 多个开
发商用于 SCADA,NA 和 OTS 等 30 多种应用;NERC,WSCC,加利福尼亚 150 等 30 多个
电力企业接受 CIM。目前国内己经有不少电力自动化系统的厂商开发出了基于 CIM 的新一
代电力调度自动化初步产品。CIM 模型的建立为整合电力系统各项应用提供了统一的、一
致性的数据交换平台。在系统之间的互联过程中要求各系统对其的所需资源做唯一性定位。
在系统之间互相访问时,资源的解析就变成十分必要的工作。
Data Access Facility 规范简称为 DAF,是 OMG 根据 UMS(包括电力、供水、天然气
等公共事业服务)的应用需要及其信息系统发展的现状和前景制定的数据读取 API。DAF
主要用于从一个 UMS 系统或应用中以近实时或非实时模式只读地获取分析数据。 DAF 和其
他数据库 API 的区别在于“简单,实用,便于快速解决一定范围内的应用(或系统)整合问
题”。IEC61970 的 CIS 部分的 402 及 403 规约的内容就是在 DAF 规范的基础进行扩充的。
所以为到实现 CIS 接口就要对 DAF 有充分的了解,而 DAF 中的资源标识服务是 DAF 的重
要组成部分。它的实现是进行资源定位查询的基础。以下本文将以 SCADA 系统为例从几个
方面来介绍该服务的设计与实现。
2. 资源标识服务
资源标志符是查询和查询结果中紧凑的资源标志。 ResourceIDService提供了ResourceID
和文本形式 URI(Uniform Resource Identifier)相互转化的方法。
2.1 URI
URI 由统一资源定位符(Uniform Resource Identifier)和一个可选的片断标志符共同构
成。按这种方式组合而成的 URI 更确切的说应该被称为 URI-reference。其格式为:
<scheme-name>:<opaque-part>#<fragment-identifier>共分三部分:
scheme-name:模式名。
opaque-part:URI 的主要部分;域(domain)+路径(pathname)的组合。
fragment-identifier:资源名 [1] 。
如在 http 模式下,设备 Switch 的 URI 为:
http://www.paper.edu.cn
- 2 -
http://www.togest.com/jqsscada/唐山东#Switch 其中,http 为模式名;www.togest.com 为域名,
/jqsscada/唐山东, 为路径,二者加起来就是 opaque-part;Switch 就是资源名。
2.2 资源标识符 ResourceID
ResourceID 是 URI 紧凑定长的替代品。在重复 URI 解析,比较和查找这些很耗费资源
的地方, 它的引入可以使 DAF 的实现有更高的性能, ResourceID 也可以简单化 DAF 的实现。
ResourceID 分 container 和 fragment 两个部分,这二者都是 64 位 long 整型,当处理大
群关联资源和复合数据源时,ResourceID 的两个域被用来进一步提高实现的效率。container
和 fragment 域对应于 URI 引用中的域。
ResourceID 根据容器来分组,在含有多个数据源的系统中,下列情况中的两个
ResourceID 有相同的 container,不同的 fragment 值:
●相同的数据源分配的两个 ResourceID,并且可以通过它的
ResourceIDService 将 URI 和 ResourceID 互相转化。
●当转换成 URI,两个 ResourceID 产生相同的 scheme-name 和 opaque-part [1] 。
另外实现应该保证同数据源有相同 container 值的两个资源的属性值是从同一数据源被
获取。Container 域对应于 URI-reference 的主体,fragment 域对应于 Fragment-identifier。
2.3 分配资源标识符
在 DAF 实现中,资源和 ResourceID 是一一对应的。为了确保唯一性,在有多个数据源
参与的情况下,DAF 必须协调 ResourceID 中的 Container 值。ResourceID 中的 Container 值
在系统初始化或者配置的时候产生。Container 值的产生方法不在 DAF 规约之内。
然而,每一个数据源必须独自分配片断。因此在 URI 引用中 fragment-identifier 是在容
器资源中独立分配和解释。类似的 ResourceID 的 fragment 也是在 container 中分配。
2.4 URI 转化成资源标志符
URI-reference 和资源是多对一的关系,一个 URI-reference 指定一个唯一的资源,但是
一个给定的资源可以有好几个 URI-reference。在 DAF 实现中,每一个资源的 URI-reference
是不同的,这就是 ResourceID 被转化时由 ResourceIDService 返回的 URI。
相反,ResourceIDService 必须能转化不同的 URI-reference 成 ResourceID。这取决于实
现的 ResourceIDService 能否将相同资源不同的 URI-reference 转化成相同的 ResourceID。
2.5 资源标识服务
客户端的用户一般只知道所查资源的URI并不知道相应资源的ResourceID,或者得到了
ResourceID 也不知道它表示的 URI,这就需要 ResourceIDService 来进行导航,它可以将资
源标志符和 URI 相互转化。这样从客户端的角度看,在给定的环境下有一个确切的资源标
志服务。 每一个数据源实现这组接口并且准备用这个接口访问其它数据源。 它包括两个接口:
根据 URI 查询 ResourceID 的 get_resource_ids()和根据 ResourceID 查询 URI 的 get_uris()。
3. ResourceIDService 服务的实现
首先,本文提出,URI 格式如下约定:
<schema-name>‘:‘ <opaque-part‘ #‘ <fragment-identifier>其中:
http://www.paper.edu.cn
- 3 -
●schema-name:暂定为 http ;
●opaque-part:格式统一为/www.togest.com/scada,如
//www. Togest.com/scada ;
●fragment-identifier:有 3 种形式,
1)对于 class:资源的名称,如:class:Breaker
2)对于 property:资源的名称.属性名称,如:property:Breaker.ampRating
3)对于 resourceinstance:资源的名称.资源实例的 name 属性值,各资源之间用斜杠“/”隔
开,如:resourceinstance: Company.FPL/Substation.0-IND-R/Breaker. CB 完整的 URI 如下例所
示:
●http: //www. togest.com/scada#class: Breaker
●http: //www. togest.com/scada#property: Breaker. ampRating
●http: //www.togest. cn/jqsscada#resourceinstance:
Company_A/Substation1/Breaker1
本文利用持久层框架能屏蔽数据库端实现细节的特性,并综合考虑 SCADA 数据库的
特点,对 ResourceID 做如下处理:
1) container 的值统一定为 scada。
2) fragment 才是系统中真正的对象标志符 OID,且具有“在所有类的实例中对象标识均
唯一”的唯一性级别。
3) ResourceID 代表所有资源实例的虚拟 OID,在从 URI 到 ResourceID 的转换过程中,
根据 fragment 值并结合既定的 container 值自动生成。 由于 fragment 具有“在所有类的实例中
对象标识均唯一”的唯一性级别,因此,为了加快查询速度,fragment 里应当包含有两个信
息:类信息(CID)和类实例(具体资源)信息(RID)。 利用这两个信息, 可以很快地定位 fragment,
也就是定位 ResourceID 。
4) C1assID 代表一个资源类的虚拟 OID,其 fragment 的作用和设置方式基本同上,但
只需包含一个信息,即类信息(CID),而 RID 的内容统一设为 0。
5) PropertyID 代表一个资源类的一个属性的虚拟 OID。 PropertyID 的 fragment 仍按前法
设置,包含两个信息:类信息(CID)和类属性信息(PID)。
6) CID 代表一个资源类在数据库里的实际 ID, 32 位 int 型, 和类的名称等信息一起存放
在单独的 Class 表内。该表不需要与各个类在数据库中的对应表发生关联关系。使用时,通
过 Java 的反射机制根据被调用的类的名称来查找该类的 CID。CID 由 ID 自动产生器自动产
生。
7) PID 代表一个属性在数据库里的实际 ID, 32 位 int 型,和属性的名称、 数据类型
等信息一起存放在 Property 表内。 该表与 Class 表发生 n: 1 的关联关系。 PID 也是由 ID 自动
产生器来自动产生。
8) RID 代表一个资源实例在数据库里的实际 ID, 32 位 int 型。 可通过为每 一棵继承
树设置一个 ID 自动产生器,来自动的生成 RID,从而保证 RID 在类层次一级的唯一性。也
可以为每个类都建立一个专门的ID 自动生成器, 从而保证在单个类的实例中的 RID 唯一性。
9) PID 和 RID 的作用相同,可以结合 CID 来共同实现 PropertyID 的唯一性或者
ResourceID 在所有类的实例中的唯一性。
10) 以 ResourceID 的产生过程为例:在 URI 向 ResourceID 转换的过程中, 将 CID
和 RID 分别转换成字符串型的 32 位 16 进制数,即 2 个分别由 8 个 16 进制数字组成的字符
http://www.paper.edu.cn
- 4 -
串。然后将这 2 个字符串合并成 1 个由 16 个 16 进制数字组成的字符串,这样,新字符串的
总长度达 64 位。 接着采用 Java 包装器类 Long 把这个 64 位的 16 进制数转换位 64 位的 long
型数,这个 long 型数就是 fragment。最后,根据前面得到的 fragment 值和设定的 containe:
值构建 ResourceID 的一个实例。将这些步骤逆向即可获得 ResourceID 向 URI 转换、
ResourceID 被解析的过程。
11) ResourcelD 的解析过程图 1 所示(将图 1 的箭头反向、开始和结束标志对调,即得
ResourceID 的产生过程)。
图 1 ResourceID 的解析过程
ResourceID 如此设计的优势在于,只需要在每个类对应的表中存储类实例的 OID、并
单建一张表管理所有类的 C1assID 即可,不需要另外建表来保存所有类的所有实例的 OID。
节省了数据库空间、 减少了一部分关联关系从而减少了数据库维护量, 又明显地提高了数据
库查询性能。用 RID 作为类实例的 OID,即不影响 ResourceID 在 IEC-61970 标准各 API 中
的使用,也便于在涉及到 SCADA 数据库的其他非 EMS 应用中用作为主键,因此特别适合
于基于 CIM 构建起来的 SCADA 数据库的业务应用。
在 ResourceID 向 URI 转换的过程中, 使用了 Java 反射机制。 反射是在运行时访问 Java
类信息的一种方法,可用它来访问类实例中的字段和方法,从而提供了一种在运行时,将类
动态地挂钩在一起却无需类之间有任何源代码链接的方法。
[2] , 文献[3]的极限测试的结果表
明:“使用反射的方法慢于采用直接接入的方法”,但反射能使程序具有强大的灵活性,反射
能使程序具有强大的灵活性,从而实现程序流程的动态选择,是一项作用非常强大的 java
特性。
本文在实现 ResourceIDService 的过程中,设计了 CimClass, CimProperty 以及一个通用
工具类 CimResource。
1) CimClass:用来保存资源的类信息, 包括该类的名称和 CID, 并以 CID 作为 CimClass
http://www.paper.edu.cn
- 5 -
本身的 OID,在数据库中建立 sequence 自动生成之。此 sequence 的起始值为 1,最大值为
19999,步长为 1。
2) CimProperty:用来保存资源的属性信息,包括一个属性的名称 PID 和 所属资源
类的 CID。以 PID 作为 OID,同样采用 sequence,其起始值为 20000,最大值为 199999,步
长为 1。
3) CimResource:用来描述一个资源实例的抽象信息, 比如每个实例的 RID , 并提供一
些通用的公共方法。CimResource 主要的方法包括:
●cimResource(String uri):公共构造函数,URI 为入口参数。
●openSession()和 closeSession():私有方法,管理数据库的连接和释放。
●endOfUri(String uri):私有方法,初步解析 URI。如果 URI 表示一个类,返回值为 URI
所表示的类的名称;否则,返回值为 URI 所包含的“类名.属性名”或者“类名.资源实例的 name
属性值/类名.资源实例的 name 属性值…”。
●parseUriToClassName( ):私有方法, 根据 endOfUri()的返回值, 判断 URI 是代表一个类,
一个属性,还是一个资源实例,同时获得类名或者属性(或资源实例)所属类的类名,然后选
择 genClassID(),genPropertyID()或者 genResourceID( ),得到 CID,PID 或者 RID 。
●getClassID( Map uriinfo):私有方法,根据 URI 中的类的名称查找类的 CID。
●getPropertyID( ):私有方法,根据 URI 中的属性信息和类名查找属性的 PID。
●genResourceID( ):私有方法,根据 URI 中的资源实例路径(包括各级类的类名)递归查
找对应的 RID 。
●toCimClassID( ):私有方法,根据 ResourceID 获得类的 CID 。
●toValueOrProperty():公共方法, 根据 ResourceID 获得资源实例的 RID 或者某个属性的
PID。
●genFragment( int CID, int RID):私有方法, 根据数据库里实际存放的 CID 和 RID(或 PID)
生成 ResourceID(或 C1assID,或 PropertyID 的 fragment 部分。
●parseFragment( long fragment, int flag):公共方法,根据 ResourceID(或 PropertyID,或
C1assID)的 fragment 部分和 flag 标识, 从 fragment 中解析出 RID(或 PID)和 CID。 如果 flag=0,
则解析出 CID;如果 flag=1,则解析出 RID(或 PID。对于 C1assID,解析出的 RID 为 0。
●getResourcelD( ):公共方法,封装 URI 到 ResourceID 的完整转换过程,返回值是对应
于 URI 的 ResourceID(或 PropertyID,或 C1assID )。
经过 CimResource 类对 ResourceIdentifierService 内部逻辑的封装,解析和使用
ResourceID 的过程变得非常简洁、清晰。下面举例说明:
String uri=http: //www. Togest. cn/scada#property: Breaker. ampRating;
CimResource cr=new CimResource(uri);
ResourceID r_ id=new ResourcelD();
r_ id=cr.getResourcelD();
4 .结束语
本文先通过对 ResourceID 的结构及 URI 的结构分析入手,以 SCADA 系统为例,进行
了说明,然后以图例的方式说明了 ResourceID 的解析过程。然后通过设计 CimClass,
CimProperty 以及一个通用工具类 CimResource,来实现 ResourceIDService 服务,为其它如
查询服务等接口的实现完成了基础性的服务工作。
http://www.paper.edu.cn
- 6 -
参考文献
[1] OMG.Utility Management System(UMS)Data Access Facility,Version 2.0
[2] Deepak Alur,John Crupi,Dan Malks.J2EE核心模式(Core J2EE Patterns Best Practices andDesign Strategies) .
北京:科学出版社,2004
[3] Dennis M.Sosnoski.IBM DeveloperWorks中国网站,Java编程的动态性,第二部分:引
入反射,2003,8
The design and implementation of DAF ResourceIDService
Tao Xin,Gao Jinbiao
East China Jiao Tong University,Nanchang (330013)
Abstract
ResourceID is 64 integer types data, used for the identification of uniqueness resources in the energy
system, ResourceIDService serves and is an important service interface of DAF, have offered
ResourceID and text form URI (Uniform Resource Identifier) Method to transform each other, the ones
that have guaranteed ResourceID are correct and analytic, so design and realize the great convenience,
efficiency brought in visit of resources of this interface.
Keywords :DAF;CIS;IEC61970;CIM

时间: 2024-10-20 03:28:56

数据访问工具 DAF 中 ResourceIDService 服务的接口 设计与实现的相关文章

【Android】透明状态栏在App中的实现与接口设计

By Sodino 文章目录 1. 认识透明状态栏 2. 透明状态栏Api及特性 3. 设置透明状态栏 4. 处理消失的系统状态栏区域 5. fitsSystemWindows 6. Activity中的接口设计 7. Fragment中的接口设计 8. 白色Titlebar的处理 9. 小米 与 魅族 与 (莫名其妙的)华为 10. 腾讯优测UTest GitHub源码:TransparentStatusbar源码中分两个app TestBasic: 透明状态栏实现的示例,方便debug 白色

访问局域网服务器中的服务

单位有一个服务器还有几台电脑,服务器上部署的有arcgis server 和 MS SQL server软件,为了能在本机方位服务器上的资源,需要进行一下操作: (1)需要网线和路由器连接一个局域网 (2)需要进行如下设置: 基础篇 – 前言  1.需要是管理员权限 2.所有局域网电脑都要在相同IP段,比如都为192.168.100.X(1≤X≤255).如何查看本机IP地址 多方法图文教程详解  3.所有局域网电脑都要在相同工作组,比如都在WORKGROUP组. 4.所有局域网电脑都要开启来宾

企业级应用框架(二)三层架构之数据访问层的封装与抽象

接上一篇我们来对数据访问层进行封装与抽象.在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供相应的支持.所以今天我们要做的事情有两件,第一,定义我们的数据访问层接口:第二,屏蔽各类数据库访问技术的差异,提供统一的数据库访问模型.举个例子,我们只需要修改一下我们的配置文件,就能够把ADO.NET的实现方式,改变成EF的实现方式.好下面搭建我们的三层构

LINQ和.NET数据访问

.NET数据访问 在.NET中对于数据的访问大致有三个层面,数据访问层.内存数据集.业务逻辑层.数据层,包括了XML配置文件以及一些常用的数据库(使用SQL语句):内存数据集,主要是DataSet数据集,在DataSet中包括Datatable,而Datatable中又分为DataRow和DataColumn.具体的访问数据集中的数据,一般通过DataRow:业务逻辑层,就是常用的一些对象的泛型集合. LINQ基础 与数据访问三个层面对应,数据访问层,使用LINQ to XML.LINQ to

【7】AccessDB快速数据访问

阅读目录 C#和VB数据访问的比较 AccessDB的设计 数据库的连接 三种主要操作 错误输出及调试 小结 回到顶部 C#和VB数据访问的比较 C#中要进行一次普通的数据库查询,需要创建连接,再根据具体的数据库类型,创建相关的适配器对象,再创建命令对象,执行后,将结果填入到Dataset中,用户拿到Dataset后,再从其中的DataTable中取得数据.这种处理方式存在种种不便之处: 1.需要一系列复杂操作才能完成一个简单功能,涉及的对象多.实现的逻辑和自然的思维习惯有所不同. 2.对不同类

Spring数据访问和事务

1.模型 2.解耦 3.实现 3.1 核心接口 3.2 代码分析 3.2.1 事务管理 3.2.2 数据访问 4.使用 4.1 编程模式 4.2 配置模式 4.2.1 声明式配置方式 4.2.2 注解式配置方式 5.总结 1.模型 在一般的编程习惯中,Spring的数据访问和事务处理的层次结构归纳如下图所示: 图. 1 2.解耦 Spring事务作为一个独立的组件,其目的就是为了与数据访问组件进行分离,这也是Spring事务框架设计的原则.根据这一职责清晰的原则,Spring在设计时就对事务和数

ADO.NET 数据访问类查询、属性扩展

今天,我首先在之前所做的人员管理系统的基础上,利用数据访问类进行了所有人员信息的查询. 主程序代码: List<Users> Ulist = new UsersData().Select(); if (Ulist.Count > 0)//判断是否包含语句 { foreach (Users u1 in Ulist)//遍历 { Console.WriteLine(u1.UserName + " " + u1.PassWord + " " + u1.N

Java数据访问对象模式

数据访问对象模式或DAO模式用于将低级数据访问API或操作与高级业务服务分离. 以下是数据访问对象模式的参与者. 数据访问对象接口 - 此接口定义要对模型对象执行的标准操作. 数据访问对象具体类 - 此类实现上述接口. 这个类负责从数据源获取数据,数据源可以是数据库/xml或任何其他存储机制. 模型对象或值对象 - 此对象是简单的POJO,包含用于存储使用DAO类检索的数据的get/set方法. 实现实例 在这个将创建一个作为Model或Value对象的Student对象. StudentDao

已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。

已禁用对分布式事务管理器(MSDTC)的网络访问.请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问. 此错误好像只有sql server2005才有,2008数据库以后版本就没有此错误了. 与基础事务管理器的通信失败. .net 代码里 写事务代码 如: using System.Transactions; using (TransactionScope ts = new TransactionScope()) { } ts.Complete(); DTC登陆账户为