利用SDO体系结构简化和统一数据.docx
利用SDO体系结构简化和统一数据简介:本文阐述了服务数据对象(SDO)体系结构的关键概念,以及它所提供的强大功能和灵活性。SDO体系结构在Java(TM) 2 Platform Enterprise Edition (J2EE)社区正获得越来越广泛的普及,它也用于构建面向服务的体系 结构(SOA)的环境。在IT解决方案日趋复杂和越来越多地采用分布式体系结 构的今天,它可以满足异构数据集成的需要。引言服务数据对象(SDO)通过 Java Specification Request (JSR) 235 得到了 Java社区的认可,它也是CommonJ的一部分,CommonJ是IBM和BEA共同 制定的规范。如何访问不同数据源类型的数据在IT业界变得越来越重要,SDO 是一种应用程序编程接口(API),可以简化和统一对异构数据的访问。目前单一 数据类型的应用程序已经不再常见,信息通常都存储在不同类型的数据源中(比 如数据库、Web服务、轻量级目录访问协议(LDAP)、遗留应用程序等等)。这 种复杂性要求开发人员熟悉许多APK比如Java数据库连接(JDBC)、基于XML 的远程过程调用的JAVA API (JAX-RPC)、或者J2EE连接器体系结构(JCA)等 等)。SDO 简化和补充了 Java 2 Platform Enterprise Edition (J2EE)的开 发模式,提供了一种独特的访问异构数据源的API,同时也可用于数据处理的其 他方面,本文将对此进行详细说明。SDO的目标SDO的目标有很多,从某种程度上讲SDO看起来好像是J2EE的一把多功能“瑞 士军刀”,因为它包含的特性可实现多种不同种类的功能,基本来讲,SDO及其 相关的技术设计有以下五大主要专题:简化数据访问:第一个目标是提供对多种企业信息系统(EIS)的统一的 数据访问,包括数据库、遗留应用程序(使用JCA)、XML或者是Web服 务数据源。通过使用SDO的一种独特而简单的模型,应用程序摆脱了使 用多种API和框架进行数据访问的复杂工作。数据提取:使用SDO后,数据的表示是独立于其数据源的,它采用了一 种叫做Domain Store的J2EE模式,这种级别的数据提取有很多优点, 例如使数据操作变得更容易,实现了不同层之间的松耦合。数据操作:一旦检索到信息后,SDO会提供一种统一的编程语言进行数据 操作,简单的说,就是通过使用API及其接口,SDO客户机可以读取数 据和修改数据。SDO为此提供了连接和断开连接的两种模型,下文中将对 此做详尽的介绍。数据传输:SDO有一部分概念是关于传输对象(Transfer Object)和传 输对象组装程序(Transfer Object Assembler)模式的。数据封装到SDO 对象中后,它就可以在J2EE层间高效地传输。设计模式的采用:SDO的一个关键目标是鼓励大家采用公用的J2EE模 式,这也是SDO体系结构以一些广为人知的模式为基础的原因,例如传 输对象(Transfer Object)、数据访问对象(Data Access Object)、传 输对象组装程序和Domain Store等。如果使用了 SDO,应用程序就可以 从这些经过了验证的设计策略中受益,从而可以推动分层技术和松耦合的 发展。图1显示了 SDO在一个J2EE分层体系结构中所处的位置:图1. J2EE分层体系结构中的SDOSDO体系结构:概览SDO体系结构提供了一组核心组件,这些组件可以由支持SDO的实现和框架进 行扩充。SDO规范定义了数据持有者(数据对象(Data Object)和数据图(DataGraph),还引用了一种叫做数据中介服务(Data Mediator Service,DMS)的 组件。DMS负责访问数据源和处理数据图,如图2所示:图2. DMS的角色DataSaerce图3显示了 SDO体系结构和它的关键组件,如下所示:图3. SDO体系结构。DMSG DataGraph4- daraobjeczOut of 500specification数据对象数据对象是保存数据的组件,简单地说,它是由属性的键/值对组成的,每个值 都可以是原始的数据类型,或者是另一个数据对象。数据对象是可序列化的。设想一下您需要显示餐馆甜点的有关信息,其对应的数据对象实例可以包含下列值:清单1.数据对象值示例 <ID, 123>Description, "Chocolate Cake"><Price, 7>对于熟悉JDBC概念和java.sql.ResultSet接口的读者来说,SDO的动态API 模式是很容易理解的。就像JDBC 一样,您可以通过名称或索引来访问它的属性 值。如果在程序运行之前,还无法获知准确的数据结构的话,使用动态API是特别 适合的。SDO API提供一些简单易用的方法来获取数据对象中的值:清单2.获取数据对象中的值/ returns the first element of the graphDataObject dessert = (DataObject) graph.get(0);/ get the dessert name and its priceString dessertName = dessert.getString(Description);int dessertPrice = dessert.getInt(Price);如果在开发阶段数据结构就可以确定的话,SDO体系结构还提供了静态API功 能。例如,如果数据源是一个带有明确定义模式(xsd文件)的XML文件的话, 则SDO将支持Java代码生成和Java绑定。虽然这已经超出了 SDO规范的范 围,但是绑定技术可能会集成一些对SDO的支持,例如XML数据绑定的Java 体系结构(JAXB)。数据对象图数据对象图是一个描述数据的分层结构,它包括一个数据对象树和另一个称作更 改摘要(Change Summary)的结构(请参阅图4)。更改摘要记录了数据图中所 有数据对象的历史更改信息。此外,由于数据图是由数据对象组成的,因此它是 可序列化的。图4.数据对象图Dale grapT兀数据 元数据是一个描述对象内容的元模型,它可以让数据图实例完成自省 (introspection)。如图5所示,每个对象都与一些基本的元数据信息相关联,对象以一个类型加 一个已排序的属性列表的形式表示。图5.对象元数据hG DataObgectQ Sequence+ dataobjer:0 PropertyG Type+ property+ typeSDO体系结构还包括了一些规范中没有定义的附加组件。物理元数据前面一段描述了信息的逻辑元数据(例如当信息加载到SDO对象后的元数据), 而物理元数据(例如原始数据源格式的元数据)不在SDO规范讨论的范围内。 典型情况下,物理元数据并不会影响SDO客户机,但是它会影响到DMS,DMS是 负责访问数据源的组件。DMSDMS是一种组件,它负责提供某些方法来组装数据图,也负责将数据更改保存回 数据源。典型情况下,将会有多种不同的DMS类型,每种类型对应着一种特定 的数据源和技术(XML、JMS、JCA、JDBC等等)。DMS总是以同一种格式(数据 图)返回信息,它隐藏了实际的数据存储信息,在SDO应用程序和EIS之间提 供了一层数据提取的功能。DMS不在SDO规范的范围内,但是它在实现中可能需要将多个数据源和数据类 型的数据集成在一起,这样,唯一的SDO数据图就会包含了异构数据源的信息。 请参见图6:图 6. DMS断开连接的数据体系结构SDO模型有一个有趣的特性,就是它允许使用断开连接的编程模型,事实上当 SDO客户机提出数据图请求并收到此数据图后,它就断开了和DMS的连接,这 样避免了 DMS对数据源的持续加锁,客户机就可以不受时间限制地处理数据对 象,对数据源的更改保存以一种乐观的并行方式进行。这种断开连接的模型特别 适合n层的以Web为基础的体系结构,因为它考虑到了分层技术,同时也易于 使用,而且还可以进行高级并行访问。SDO的工作过程请求SDO图图7是一个简单请求的序列关系图。基本上,当一个SDO客户机需要检索数据 时,它使用DMS来请求数据图,DMS负责管理对数据源的访问,并根据接收到 的信息来创建一个图,通常这个图是一个分层的树结构,其中包含了几个数据对 象。此客户机使用断开连接的编程模型来处理数据图。如果数据被修改,而且客 户机希望能保存这些更改,它会将更改后的数据图发送给DMS,然后由DMS去 修改数据源。5D0 CfientSDO Client图7. SDO图dM5;DM5datsSourcetDataSource1: / load DataGraohL2: / read*etiirn+1,3: / re&d 1.1: /:' start transaction加return *2: / load DaLJGraDh1-4: V construct DataGraph1.5: H end transacboflTi3: h f&ad DacaGraph4: modfy DataGraph4.1: /' save mzGrauhti stirttansJGtiQn4.1,2:jddateU*p4-L-2.1- /y enci t?nsactiafi序列化数据图数据图中的所有对象扩展了可序列化的Java接口,这样,树的序列化是很简单 的,但是必须注意以下模式,如图8所示。图8.序列化数据图目前来讲,规范并没有明确说明该如何描述数据图。其中一个称为“model”的 元素支持 Essential Meta Object Facility (EMOF),而另一个称为 “xsd” 的元素可用来存放XML模式。SDO对这两者都支持,这两种元素的作用也都一样: 用于描述元数据。序列化完成后,数据图由三部分组成:模式、序列化的数据对象和更改摘要,如 图9所示。数据对象部分包括了树型结构和对象的值,而更改摘要则列出了序 列化完成前数据图的所有更改,原始树结构中未更改的数值则被省略了。数据图 框架模式仅在需要反序列化的情况下才出现,如前所述,它可以是XSD或者是 EMOF模型。图9.序列化的数据图的三个组成部分 IIIIgraph schema ! Data objects! Change suTimaryEoiEo2 J03 X)i>05 DQ6 borLoljDS . DOn - aSerialized SDQ dtita遍历数据图SDO有一个很重要的特点就是使数据操作变得更容易了,因此一旦构造好一个数 据图,很重要的一点就是需要使用SDOAPI来遍历树结构,并访问其中的元素。 规范的作者选择了使用XPath语言来完成这一工作°XPath应用在SDO中时它 仅有一个特殊的地方:在访问数据时,它使用0作为基本索引,而XPath规范 中第一个元素只能通过索引值1识别,这个特殊的规定是为了使SDOAPI更接 近Java API,因为编程人员习惯了在引用数组的第一个元素时,使用 array0 这样的语法来表示。我们来看一个简单的例子:餐馆的菜单,体会一下如何处理数据图中的数据对象。 它可以用以下的统一建模语言(UML)关系图来描述,如图10所示。要访问Menu对象,只需使用:DataObject menu = root.getDataObject(Menu);现在查看的是哪一类菜单呢?下面的表达式将会告诉您:String menuType = menu.getString(Name); /顺便提一下,这是正餐。现在假定您想点主菜。您需要了解今天的菜单上都有些什么菜:DataObject mainDish = menu.getDataObject(coursetypeType='Main'");如果您决定点丁字牛排(T-Bone),您可以根据它的索引直接从数据图中访问它:DataObject tBone = (DataObject) mainDish.get(0);要查看您是否带了足够的钱来付账,可以获取价格:int tBonePrice二 tBone.getInt("Price");您还饿吗?来点甜点如何?首先您可以调出树结构中甜点的清单,以便做出决 定:DataObject dessert = menu.getDataObject("coursetypeType='Dessert'"); List dessertList = dessert.getList();接下来您可以访问刚才所获得的顺序集合中的元素。或者可能您已经决定了选择 美味的巧克力蛋糕。您可以使用以下表达式来直接访问它:DataObject cake = menu.getDataObject(coursetype.2/dishes.2);XPath的使用使访问数据对象图的元素变得简单而直观。SDOAPI中还有很多附 加的特性可用于创建或删除对象,或者是改变它们的值。SDO的应用前景到目前为止,SDO看起来不只是一个API,它还是一个设计和编程模型,所以SDO 可以(或者将来有可能)在多个企业应用程序概念中使用。我们现在来看看其中 的一些例子。持久性机制 使用SDO的目的并不是替换现有的持久性机制,而是利用它们提供一个统一的 编程接口。典型地,编程人员将只专注于唯一的编程模型(SDO),而不用学习多 种API和框架。取而代之的是在幕后由支持SDO的工具和DMS来处理所有特 定而繁琐的数据源语义。这样,即使在不知道数据源的情况下,SDO客户机都可 以通过 DMS 与 JDBC、Java 数据对象(JDO)、Hibernate、Entity Enterprise JavaBean (EJB)、Web服务及任何其他数据源进行交互。不同应用程序层间的交互SDO对象是独立于底层数据源的,它们将信息封装在简单原始的Java对象 (POJO)中,与一些特定技术(如EJB或Servlet)没有什么关系。因此,在J2EE体系结构中,SDO对象是跨级使用的最佳候选对象。它们可以首 先由集成层(integration layer)创建为值传递的Java对象,然后发送给业 务层。此外SDO对象可以在表示层和业务层间传递信息。用户界面数据绑定(JSR 227)最近人们越来越多地在致力于使用户界面组件(UI)和业务服务间实现自动绑 定,而不需要考虑所使用的具体技术。例如,怎样使JavaServer Faces (JSF)组 件以标准的方式与EJB或Web服务实现交互?如何让Struts组件使用同一 标准? SDO提供了相应的对象和API来轻松地实现JSR227工作组确定的绑定 需求。工具和框架SDO采用的模型是规范化的和可自动描述的,因此它可用来使工具和框架以标准 方式自动访问数据和生成Java对象。SDO还具有自省功能和拥有动态数据 API,这样就可以轻松地与现有的和即将出现的工具相集成。如果能被广泛接受 的话,作为一个公用API,SDO将统一现有的数以千计的框架结构。SOASOA旨在推广一种可互换的、适应性强的和灵活的行业标准框架。这都要求提供 随需应变的业务,但是在IT基础设施中,SOA还仅仅只是一个概念或者说是一 个蓝图。业界已经采用了 Web服务标准来实现SOA的应用程序。Web服务展示 了一种独立的自描述功能,这样其他应用程序可以通过开放的标准来寻找和访问 它。Java社区可以依靠一组API和相关技术来发布、发现和使用服务,这意味 着您可以使用定义明确的协议(如简单对象访问协议(SOAP)来和外部应用程 序交互。但是到目前为止,在应用程序内传递信息还没有标准的方式,当然,这也可以通 过自己开发Java对象或利用XML绑定如JAXB、Castor、XMLBeans或很多今 天的其他技术来实现,但是您真的希望被这些各式各样的技术和框架绑住手脚 吗? 在这种情况下,SDO可以提供帮助,它提供了一种独特的模型来存放结构化的和 相互关联的复合对象,您的应用程序可以使用这些对象来保存信息。而且,对种 类繁多的数据源和业务SDO提供了一个统一的数据访问。它还可以在业务处理 和信息源间实现解耦合。从某种意义上讲,SDO框架可以简化和统一 SOA中的 数据应用程序开发,它提供了一种标准化的和与厂商无关的方法来处理异构问 题。IBM工具SDO不仅仅是一个规范,您可能已经发现了有一些工具利用了 SDO技术来访问 异构的EIS。WebSphere® Application Server Version 6.0 (Application Server) 遵循 J2EE 1.4,它提供了一组编程模型扩展,来满足一些特定的尚未被规范涵盖的企业需 求。为了推广 SOA, Application Server Version 6.0 支持 SDO,并提供了一 些DMS的实现。WebSphere Studio Application Developer Version 5.1.2 以及 IBM 的下一代 软件开发平台(Rational® Application Developer Version 6)完全支持SDO。 IBM提供的SDO规范的参考实现已经包含在Eclipse Modeling Framework中, 因此只要导入正确的包(import org.eclipse.emf.*;),您就可以开发支持SDO 的应用程序了。另外,如前所述,WebSphere (即IBM的开发平台)提供了几个 DMS的实现,您可以将它们集成到您的应用程序中 (com.ibm.websphere.sdo.mediator.*)。结束语SDO规范1.0版于2003年末提交给Java Community Process,并获得了批准, 但它仍在不断的发展中。和其他所有提交的规范一样,很难预料它最终是否会被 广泛地采用,不过,这个规范得到了主要的Java行业风险投资的支持,它也确 实着重于解决通用企业应用程序的一个重要问题:异构数据访问。SDO为业务数 据提供了一种中立的表示方法,建立了一种与数据源无关的模型,降低了耦合度。 基于以上原因,它可能会成为将来SOA应用程序的一个重要组件。