王 芳,汪 進,王家群,顧曉慧,袁 潤,李亞洲,胡麗琴,吳宜燦,FDS團隊
(1.中國科學技術大學核科學技術學院,安徽 合肥 230027;
2.中國科學院等離子體物理研究所,安徽 合肥 230031)
安全性是發展核電的關鍵問題之一,在保證核電安全的同時提高其經濟性,是核電站追求的重要目標。風險監測系統是基于核電站實時配置狀態計算瞬時風險水平的軟件系統,能夠為核電站安全穩定經濟運行提供指導性意見和建議,從而提高運行安全性和經濟性[1]。目前國外多數大規模核電站都已應用或正在著手研發此系統,自1988年第一套風險監測系統在英國投入使用以來,截至2004年共有約150套在線投入使用,而國內則起步較晚。現有風險監測系統大多為單機版或C/S(客戶端/服務器)架構[2]。FDS團隊開展了核電站安全分析研究工作,發展出了具有完全自主知識產權的概率安全評價軟件 RiskA[3-4],并在 RsikA平臺上成功研發了風險監測系統 RiskAngel系列[5-6]。
風險監測系統在核電站中的使用對象比較廣泛,物理地址分布相對獨立,且在使用中可能存在并發;核電站中實時風險模型大,系統計算量大,而系統需要獲取準確的核電站風險數據及時進行反饋。因此本文要解決的關鍵問題是如何在較短的時間內開發出計算結果正確且響應速度高的系統。
針對以上問題,在充分比較分析現有各種web應用技術的基礎上,最終選擇了基于J2EE的輕量級架構SSH(Struts+Sp ring+Hibernate)組合框架實現風險監測系統的開發。
風險監測系統使用對象物理地址的獨立性,決定了該系統需要開發為網絡版,以方便用戶使用。傳統C/S結構軟件的數據分布安全性差,適用于局域網,可連接用戶數有限,擴展維護復雜、代碼可重用性差 、維護和升級成本非常高[7]。
B/S(瀏覽器/服務器)結構是對C/S結構的一種改進,在此結構下,用戶工作界面通過瀏覽器來實現,極少部分事務邏輯在瀏覽器端實現,但主要事務邏輯在服務器端實現,大大簡化了客戶端電腦載荷,減輕了系統維護與升級的成本和工作量,降低了用戶的總體成本。基于B/S的網絡應用是一次性到位的開發,能實現不同人員從不同地點以不同接入方式訪問和操作共同的數據庫;它能有效地保護數據平臺和管理訪問權限,服務器數據庫也很安全。B/S結構是信息化發展的主流方向,本文選擇基于此結構進行系統的設計。
基于B/S結構的web應用主要有兩種實現方案:J2EE和.NET。相比.NET,J2EE開放標準,功能強大,易于移植,且安全性好[8],因此選擇J2EE技術開發本系統。以實現基于B/S結構的風險監測系統開發為目的,本文研究和分析了基于J2EE架構的多種框架。
當前大多web應用程序采用傳統的基于EJB2.0的J2EE架構進行開發,此種框架為重量級框架,存在一系列難以避免的問題,例如部署復雜,運行緩慢;內在服務多,啟動慢;規則特別多,空間很小;難以測試等[9]。而輕量級J2EE架構則可以解決這些問題,其中融入了新的模式,可提供更靈活和可選擇性的服務。大多數基于J2EE的web應用從職責上可以分為4層:表現層、業務邏輯層、數據持久層和域對象層。下面我們將討論各層框架選擇和實現。
MVC(Model-View-Controller)架構是一種強制性地將應用程序的輸入、處理和輸出分開的設計模式,此架構可以使應用系統結構更加清晰,升級和維護更方便。Struts框架是MVC模式的忠實體現[10]。因此,表現層采用Struts框架實現。
業務層需要處理業務邏輯和交叉業務邏輯,事務,日志,安全等,這些都與Spring的 IoC(控制反轉)與AOP(面向方面編程)不謀而合,用它可實現業務代碼的高效分離[11]。Spring是整合的業務層框架,能很好地黏合表示層與持久層,也是J2EE框架中最成熟的框架。因此,在眾多業務邏輯層框架中選擇Sp ring框架。
系統設計中采用了面向對象思想,如何將對象間關系準確無誤地映射為數據庫中表格與表格之間的關系是本文必須解決的重要問題。H ibernate正是一個面向Java環境的對象/關系數據庫映射工具,它提供了自動對應轉換的方案。H ibernate不僅管理Java類到數據庫表的映射,還提供數據查詢和獲取數據的方法,可極大減少開發者的數據持久化相關編程任務[12]。因此,選擇Hibernate作為數據持久層和域對象層框架。
綜合上述分析,本文選擇使用SSH框架組合進行風險監測系統的開發,將這3個框架進行有機整合可以更好地發揮它們的優勢,實現系統多層開發的低耦合。
本應用程序使用MyEclipse7.0作為開發環境,其中大部分插件都已集成好,并集成了許多開源框架,如Struts、Spring、Hibernate等。服務器采用了技術先進且性能穩定的tomcat6.0。數據庫則采用了穩定性和安全性較好的oracle10g。
按功能劃分,風險監測系統主要分為8個功能模塊,其具體劃分見圖1。每個功能模塊均獨立采用SSH組合框架實現。

圖1 系統功能模塊Fig.1 Function module of Risk Monitor
下文以部件查詢功能為例,闡述各框架是如何協作來實現此功能。
表示層是由Struts框架實現的。在此框架的應用程序中,先由視圖層請求Action,然后配置前端控制器以攔截來自客戶端的請求。前端控制器首先讀取配置文件struts.xm l中的配置信息,根據配置信息為請求選擇對應的處理控制器和響應類型。
部件查詢功能的響應過程為,首先利用setter方法將所需 bean全部注入后,在 rm.aciton.base.GetA llCom ponentAction類中使用stateLookUp.findComponent(number)函數來實現部件查詢功能,其中stateLook Up為注入到此類中的bean。
Sp ring是業務邏輯層的容器,連接表示層和持久層,將對持久層的操作封裝在bean里,讓前端表示層調用相應bean來完成對后臺數據庫操作。Sp ring的控制反轉容器,可以保留抽象接口,讓組件依賴于抽象接口,當組件要與其他實際的對象發生關系時,由抽象接口來注入依賴的實際對象[13]。按編號查詢部件功能的業務邏輯層實現如下:先將bean componentDao注入業務邏輯層接口中,再利用其實現類中component Dao.findComponent(number)函數實現。
程序開發過程中與數據庫的交互主要包括:添加、讀取、修改和刪除。應用 Hibernate可以自動生成DAO類,但為避免Spring入侵,本系統開發中選擇手動創建。為實現編號查詢部件功能,需要在 DAO實現類中實現 find Com ponent(String num ber)函數具體功能。
風險監測系統中所有與數據庫交互的工作都由H ibernate完成,它改變了傳統開發模式,不先建表而先把對象模型建立起來直接操作對象。因此開發中需要先創建實體類,在類中建立與其他類間的關系,通過Hibernate將這些關系進行映射,把對象生成數據庫表。
為工程添加完Spring、Hibernate和Struts框架支持后,需要將3個框架有機整合起來,本文采用設置配置文件進行三大框架整合的方法。
1)Spring與Hibernate整合
Hibernate的連接、事務管理等都由建立sessionFactory開始的,SessionFactory底層數據源使用 Spring的 IoC注入,之后再將SessionFactory注入互相依賴的對象中,這就實現了Hiberante和Spring的整合。
2)Spring與Struts整合
要將Struts與Sp ring結合使用,最主要是讓Struts知道Spring的存在,以讓Spring管理相關組件,避免在程序中直接寫組件的依賴關系建立。系統功能模塊較多,邏輯相對復雜,為了便于代碼維護,將系統中各模塊實現所需DAO類,Manager類和Action類分別寫在 3個配置文件中。當應用服務器載入web應用時,先從 web.xm l讀起。本程序采用了在web.xm l中先配置上下文載入器,然后指定上下文載入器的3個Sp ring配置文件的方法實現了Spring與Struts的整合。
整個系統依賴關系為:Action依賴Biz(業務層),Biz依賴DAO(數據訪問層),DAO依賴SessionFactory,SessionFactory依賴數據源,利用Spring管理這些依賴關系。圖2為系統的業務流程圖。

圖2 風險監測系統業務流程Fig.2 Business Process of Risk Monitor
A jax技術被廣泛應用于本系統的設計中,系統web頁面設計主要采用ExtJS技術,利用ExtJS封裝的Ext.A jax.request方法來實現前臺頁面對后臺的請求。
采用A jax技術實現了客戶端與服務器端的異步通信,在不更新整個頁面前提下維護數據,這使web應用程序更為迅捷地回應用戶動作,并避免了在網絡上發送沒有改變過的信息。運用此技術同步了客戶端與服務器端的時間進度,將一部分操作轉移到了客戶端,減輕了服務器端壓力。采用此技術后,在一定程度上提高了系統響應速度。
整個系統需要解決的一個重要問題是當多個用戶同時提交在線、離線或維修計劃計算時,如何確定計算請求順序以達到多個請求間數據互不混淆的目的,最終保證程序正確性。本文引入了隊列類來將計算請求排隊,使其按照提交的先后順序進行計算。
用戶提交的所有計算請求都被放入隊列中,線程監聽類監聽隊列中計算請求是否為空,若為空,線程休眠,否則,從隊尾取出一個計算請求提交計算核心計算。由于同一進程的多個線程共享同一片存儲空間,因此會存在訪問沖突問題。為了解決此問題,在隊列類中處理業務時使用java同步機制,即在業務方法前加鎖的方法,以保證進程間互斥地使用該方法,最終確保計算結果正確性。
風險監測系統采用了基于J2EE輕量級架構的SSH整合框架進行開發,整個系統架構以Sp ring為核心,向上整合了Struts,向下整合了Hibernate。測試表明,該系統計算結果正確且具有較高的響應速度,各模塊之間交互過程中耦合性降低,內聚加強,從而增強了系統的健壯性。此外在本系統中軟件的可重構性和可用性得到了提高,大大提高了開發效率,可以在較短的時間內構建出系統的原型系統。最后該系統具有非常好的跨平臺性、擴展性、可維護性與安全性。
[1] IAEA.Living probabilistic safety assess-m ent[R].IAEA-TEC-1106,1999.
[2] OECD/NEA.Development and Use of Risk Monito rs at Nuclear Pow er Plants[R].CSNI Technical Opinion Papers,2005.
[3] 吳宜燦,胡麗琴,龍鵬程,等.先進核能系統設計分析軟件與數據庫研發進展[J].核科學與工程,2010,30(1):42-50.
[4] 吳宜燦,劉萍,胡麗琴,等.大型集成概率安全分析軟件系統的研究與發展[J].核科學與工程,2007,27(3):270-276.
[5] 吳宜燦,胡麗琴,李亞洲,等.秦山三期重水堆核電站風險監測系統研發進展[J].核科學與工程.
[6] 王海濤,吳宜燦,李亞洲,等.核電站風險監測器軟件開發研究[J].核動力工程,2009,30(1):26-30.
[7] Catherine.C/S Teaching in the 21st Century[J].The In ternet and Higher Education,1999,1(4):281-289.
[8] Sun Microsystems Inc.Java TM 2 Platform Enterprise Edition Specification Version 1.4[R].2002.
[9] 徐鵬.輕量級J2EE架構的研究與應用[D].電子科技大學,2007.
[10] 孫鑫.Struts2深入詳解[M].北京:電子工業出版社,2008.
[11] 余臘生,任炬.基于SSH三層架構的OJ系統研究與設計[J].電腦知識與技術,2008,3(8):1698-1701.
[12] 葛京.Hibernate 3和Java Persistence API程序開發從入門到精通[M].北京:清華大學出版社,2007.
[13] 林信良.Spring 2.0技術手冊[M].北京:電子工業出版社,2007.