王 芳,汪 进,王家群,顾晓慧,袁 润,李亚洲,胡丽琴,吴宜灿,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.