1 系统目标与功能
数据访问中间件是为了解决分布式网络环境中,透明访问异构数据资源而开发的软件实现了应用领域中对象实体及属性与关系数据库中的关系表及数据之间的相互映射,从而使该中间件的使用者能够直接面对业务模型,以面向对象的方式进行业务实体的操作。
MGDAM要能满足以下功能需求:①利用合适的分布式数据访问方法和数据提供方式,实现对不同单位海洋地质数据的分布式访问。②为上层业务应用提供统一的业务模型。③解决面向对象的开发和关系数据存储间的不匹配问题,实现对象关系映射(O/R-M)[4]。同时,基于合适的对象关系映射工具,能自动生成代码,减少开发工作量。④能快速适应数据源的变化。⑤主要满足用户信息查询的需求,不涉及进行数据的修改。
2 系统设计
2.1 系统架构设计 MGDAM的框架结构如图1所示,MGDAM位于异构数据源系统(数据层)和应用程序(应用层)之间,向下协调各数据源系统,向上为访问集成数据的应用提供统一数据模式和数据访问的通用接口[5]。其中数据层是实际的物理数据存储,主要是各类关系型数据库,包括Oracle、SQL Server、Access,提供关系数据模型,以关系表、字段、记录等方式提供数据。应用层是各种应用程序,包括WEB应用程序、WinForm应用程序等。
MGDAM内部自下而上又可以分为四个逻辑层次:持久化层、业务模型层、数据服务层、服务管理层。
持久化层[6]提供对象关系映射框架,实现对象关系映射机制;由于本项目是基于.net进行开发,则采用基于.NET的ORM映射工具NHibernate[7],利用NHibernate自动生成SQL去从数据库存取对象。
业务模型层调用持久层以实现业务对象的持久化,提供映射后的业务对象模型,业务对象模型是统一逻辑模型的子类,符合逻辑模型定义,为数据服务层服务。
数据服务层利用分布式通信编程框架WCF(Windows Communication Foundation)[8]构建数据服务传递数据,将业务对象模型发布为数据服务,对外部系统提供标准的应用程序接口,为下一步工作中构建企业级的面向服务架构提供服务。
服务管理层完成寻找数据源或服务、传输查询请求、返回访问结果的任务。
2.2 统一对象模型设计 海洋地质调查逻辑模型的设计遵循了以下原则:①体现面向对象的技术本质。采用面向对象的建模技术,以客观现实中的实体为依据进行数据组织,描述引用关系、继承、聚集以及多对多关系。②体现科学的数据管理体系。以海洋地质调查对象为数据单元,能根据不同应用的需要重新组织成所需要的数据集。③具有高度的集成性。模型覆盖海洋地质调查所有领域的对象,这些对象不按专业进行分割,而是按客观世界中对象间的联系组织,使各专业的应用软件都可以对该模型进行操作,并且其数据是相互一致的,实现不同应用软件在数据一级上的集成。典型代表如海洋地质取样数据逻辑模型,其UML类图如图2所示,包括样品站位要素类和多个对象类,如取样现场记录、样品入库记录、岩芯描述、岩芯照片、分析测试等。
2.3 基于对象模型的数据契约设计 基于对象模型进行数据契约(Data Contract)[8]设计,主要是对对象模型中的每个对象类,通过DataContract与DataMember属性将其定义为数据契约。MGDAM基于C#语言将类的属性定义为C#的Virtual属性,并通过get和set关键字实现属性的定义。
3 系统实现
3.1 基于NHibernate实现对象关系映射 基于NHibernate实现对象关系映射,需要在建立持久化类基础上,创建NHibernate表映射和数据库连接。其实现的关键是创建NHibernate表映射,即建立映射文件,每个数据库表对应一个映射文件,用于生成数据模型。在映射文件中定义了数据存储到哪个数据库表,哪个属性映射到哪个字段,不同的对象如何相互关联。在运行过程中,NHibernate根据映射文件生成SQL语句[9]。如钻孔信息(BoreholeInfo)的映射文件定义如下:
table="Borehole">
unsaved-value="0">
Z
<!--一对多关系:BoreholeInfo有一个或多个DrillingRecords -->
3.2 基于WCF实现数据服务 基于WCF实现数据服务的构建和托管,包括了以下过程:①创建WCF Service Library工程。②定义数据契约。③定义服务契约,通过ServiceContract与OperationContract属性将接口定义为服务契约。④实现服务契约,定义一个服务实现类,实现服务契约接口。⑤绑定数据服务。⑥数据服务的托管。为了方便数据服务部署,MGDAM采用了基于控制台应用程序实现数据服务自托管,其关键代码如下:
namespace HOST
{ class Program
{ static void Main(string[] args)
{ Type serviceType=typeof(DataProviderService);
using (ServiceHost host = new ServiceHost(serviceType))
{ Console.WriteLine("Data Services Starting....\r\n");
host.Open();
Console.WriteLine("Data Services Available!\r\n");
Console.ReadKey(true);
Console.WriteLine("Data Services Stoped!\r\n");
host.Close();
}
}
}
}
3.3 分布式数据服务的访问 MGDAM的数据服务管理层负责对分布式数据服务进行注册、管理和访问,其关键技术为数据服务的动态调用,关键代码如下:
IList dataProvider =ConfigurationManager.Get("dataProvider.config");
……
foreach (string strRemoteAddress in dataProvider)
{DataProviderClient client = new DataProviderClient("WSHttpBinding_IDataProvider", strRemoteAddress);
//根据已注册的数据服务动态调用
//使用 "client" 变量在服务上调用操作。
….
client.Close();
}
if (docRst != null)
return (XmlDocumentToString(docRst));
else
retur
n "NULL RESULT";
4 结论
海洋地质数据访问中间件,利用NHibernate将数据从关系数据库中的表形式转化为对象,使得数据层和业务层分离,提高了系统的扩展性,同时提高了开发效率和质量;MGDAM基于WCF构建数据服务,为分布式海洋地质数据的访问提供了标准接口,使得已有信息系统和数据源能够在保持自治的基础上被充分利用起来,这样不仅节省了资源,而且也为信息化的不断发展提供了空间。
参考文献:
[1]林宏彬.基于中间件的数据访问服务的实现[D].华北电力大学(北京)硕士学位论文,2007.
[2]Vijay Narayanan. Introduction to Data Services[J/OL]. http://www.infoq.com/articles/narayanan-soa-data-services,2009.
[3]戴勤奋,苏国辉,魏合龙等.海洋区域地质调查数据库数据结构[R].青岛海洋地质研究所,2005.
[4]张彦歆.基于.NET平台ORM技术的研究与应用[D].上海交通大学硕士学位论文,2009.
.中国海洋大学硕士学位论文,2010.
[6]孙卫琴.精通Hibernate:Java对象持久化技术详解[M].电子工业出版社,2005.
[7]NHibernate-Relational Persistence for Idiomatic.NET. NHibernate Reference Documentation. http://www.hibernate.org/hib-docs/NHibernate/html/2006-06-03.
.电子工业出版社,2012.
[9]秦泽叶,高改梅.Nhibernate在实验室信息管理系统中的应用研究[J].科学之友,2010(30):40,43.