數據訪問工具 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 的產生過程)。 ![](http://static.javashuo.com/static/loading.gif) 圖 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 |