数据访问工具 DAF 中 ResourceIDService 服务的接口设计与实现
java 摘 要:数据库 ResourceID 是 64 位整型数据,是用来定位能量系统中惟一性资源的标识,ResourceIDService 服务是 Data Access Facility 规范简称为 DAF 中的一个重要服务接口,提供了 ResourceID 和文本形式 URI(Uniform Resource Identifier)相互转化的方法,保证了ResourceID 的正确解析, 因此设计与实现该接口对于资源的访问带来的极大的便利性、 高效性。编程 关健词:框架 数据访问工具;通用组件接口;61970 系列标准;公用数据模型dom 1. 引言ide 在 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.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>其中:
●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 进制数字组成的字符 串。而后将这 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
自己的 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 服务,为其它如 查询服务等接口的实现完成了基础性的服务工做。
参考文献 [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 |