




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
选择数据访问模式,合理规划数据访问层级别:初级陈隽伟,软件工程师,旧M中国软件实验室2005年2月01日本文介绍了主流的数据访问技术和典型的数据访问模式,并举例说明了如何在典型场景中选择合适的模式与技术。简介在一个典型的电子商务应用中,三层架构(或是它的变形-N层架构)常常是架构师们的首选,这当中包括表现层,商业逻辑层和数据访问层。本文的关注点放在数据访问层,它负责和应用中的各种数据源打交道,诸如DB2、Oracle等关系型数据源、XML数据以及其它种类的非关系型数据、Web服务、各种特别的遗留系统等等,将它们整合起来,为商业逻辑层提供统一的数据服务。在本文中,你可以了解到下面这些内容:主流的数据访问技术典型的数据访问模式举例说明如何在典型场景中选择合适的模式与技术这不是一篇专门介绍数据访问技术的文章,也不是一篇有关数据访问话题的完整的索引;而是抛砖引玉,超越数据访问技术这个层次,希望通过一些归纳和讨论使得读者能够更多地关注于数据访问模式,并在自己的实践中有意识地选择合适的模式,这才是本文的目的。个回页首主流的数据访问技术从数据库技术诞生到现在,已经有了数十年的历史;相应的,从最早的读写磁盘文件开始,数据访问技术也不断的推陈出新,变得越来越丰富。在最初的日子里,不同的数据库厂商会提供不同的访问接口,开发人员需要针对每种数据库学习不同的访问技术,比如DB2系统的CLILibrary或是Oracle的OCILibrary。再到后来,数据访问中间件的思想得到了发展,出现了最初的ODBC(OpenDatabaseConnectivity:开放数据库连接)以及其它一些类似的访问技术。在C和C++流行的年代里,这项技术在微软的推动下不断发展,后来又有了诸如OLEDB(ObjectLinkandEmbeddingDatabase)以及ADO(ActiveXDataObject)等数据访问技术,它们直到今天还运行在世界各地成千上万的系统中。这里,我们更为专注的是现在的主流数据访问技术,它们是:JDBC(JavaDatabaseConnectivity:Java数据库连接)依照JDBC规范,有四种类型的JDBC驱动程序体系结构:oType1:这类驱动程序将JDBCAPI作为到另一个数据访问API的映射来实现,如开放式数据库连通性(OpenDatabaseConnectivity,ODBC)。这类驱动程序通常依赖本机库,这限制了其可移植性。JDBC-ODBC桥驱动程序就是Type1驱动程序的最常见的例子。oType2:这类驱动程序部分用JAVA编程语言编写,部分用本机代码编写。这些驱动程序使用特定于所连接数据源的本机客户端库。同样,由于使用本机代码,所以其可移植性受到限制。oType3:这类驱动程序使用纯JAVA客户机,并使用独立于数据库的协议与中间件服务器通信,然后中间件服务器将客户机请求传给数据源。oType4:这类驱动程序是纯JAVA,实现针对特定数据源的网络协议。客户机直接连接至数据源。目前,有关JDBC最新的工业规范是JDBC3.0,/en/jsr/detaMidn54JSR54,这是在JCP上的规范。在下面的链接中,你可以获取到有关JDBC3.0的最新资料。/developerworks/cn/java/j-jdbcnew/index.htmlJDBC3.0的新特性这是Sun的官方网站上,这是有关JDBC相关技术的信息中心/products/jdbc/index.jsp在主流的数据访问技术中,微软相关的数据访问技术自成一套体系。下面简单的回顾一下微软系列的数据访问技术所走过的几个阶段:oODBC(OpenDatabaseConnectivity):是第一个使用SQL访问不同关系数据库的数据访问技术。使用ODBC应用程序能够通过同样的命令操纵不同类型的数据库,而开发人员需要做的仅仅只是针对不同的应用加入相应的ODBC驱动。oDAO(DataAccessObjects):不像ODBC那样是面向C/C++程序员的,它是微软提供给VisualBasic开发人员的一种简单的数据访问方法,用于操纵Access数据库。oRDO(RemoteDataObject):在使用DAO访问不同的关系型数据库的时候,Jet引擎不得不在DAO和ODBC之间进行命令的转化,导致了性能的下降,而RDO(RemoteDataObjects)的出现就顺理成章了。oOLEDB:随着越来越多的数据以非关系型格式存储,需要一种新的架构来提供这种应用和数据源之间的无缝连接,基于COM(ComponentObjectModel)的OLEDB应运而生了。oADO:基于OLEDB之上的ADO更简单、更高级、更适合VisualBasic程序员,同时消除了OLEDB的多种弊端,取而代之是微软技术发展的趋势。oADO.NET:微软在.NET框架中提出的全新的数据访问模型。在开始设计.NET体系架构时,微软就决定重新设计数据访问模型,以便能够完全地基于XML和离线计算模型。两者的区别主要有:ADO以Recordset存储,而ADO.NET则以DataSet表示。Recordset看起来更像单张数据表,如果让Recordset以多表的方式表示就必须在SQL中进行多表连接;而DataSet可以是多个表的集合。ADO的运作是一种在线方式,这意味着不论是浏览或更新数据都必须是实时的;而ADO.NET则使用离线方式,在访问数据的时候ADO.NET会导入并以XML格式维护数据的一份副本,ADO.NET的数据库连接也只有在这段时间需要在线。此外,由于ADO使用COM技术,这就要求所使用的数据类型必须符合COM规范,而ADO.NET基于XML格式,数据类型更为丰富并且不需要再做COM编排导致的数据类型转换,从而提高了整体性能。图1即描绘了ADO技术的体系结构:图1:ADO架构而图2则描绘了ADO.NET技术的体系结构:图2:ADO.NET架构你还可以在下面的链接中得到更多有关ADO和ADO.NET方面相关的参考资料。ADO.NET&ADOADO.NET技术的简单介绍技术的简要历史你可以在这个页面上找到很多有关ODBC技术的链接+回页首典型的数据访问模式如果说数据访问技术是一些得心应手的兵器的话,数据访问模式就应该是各种武功秘笈了,它们才是致胜的法宝。架构师在不同的应用场合下可能会选择不同的数据访问模式,并且还会不断地推陈出新,这里不会也不可能穷尽所有的数据访问模式,而只是列举了其中最为典型的几个。数据访问模式1:在线访问在线访问是最基本的数据访问模式,也是在实际开发过程中最常采用的。如图3所示,这种数据访问模式会占用一个数据库连接,读取数据,每个数据库操作都会通过这个连接不断地与后台的数据源进行交互。数据访问模式2:DataAccessObject图4:DAO模式如图4所示,DAO模式是标准J2EE设计模式之一,开发人员常常用这种模式将底层数据访问操作与高层业务逻辑分离开。一个典型的DAO实现通常有以下组件:一个DAO工厂类一个DAO接口一个实现了DAO接口的具体类数据传输对象(有时称为值对象)这当中具体的DAO类包含访问特定数据源的数据的逻辑。下面的这两篇文章给出了一个通过DAO模式访问JDBC数据源的完整的例子:DataAccessObjectImplementationWriteonce,persistanywhereImplementationofJDBCDAOProvider数据访问模式3:DataTransferObject
图5:DTO模式■GuatDmef&TOGelCustomerDTOOGe:FirstName(jGetMiddleNairieOGelLaelNamei)如图5所示,DataTransferObject是经典EJB设计模式之一。DTO本身是这样一组对象或是数据的容器,它需要跨不同的进程或是网络的边界来传输数据。这类对象本身应该不包含具体的业务逻辑,并且通常这些对象内部只能进行一些诸如内部一致性检查和基本验证之类的方法,而且这些方法最好不要再调用其它的对象行为。图5:DTO模式■GuatDmef&TOGelCustomerDTOO在具体设计这类对象(DTO)的时候,通常可以有两种选择:1.使用编程语言内置的集合对象,它通常只需要一个类,就可以在整个应用程序中满足任何数据传输目的;而且因为几乎所有的编程语言都内置了集合类型,我们不需要再另外编写这个类的实现代码。同时,使用内置的集合对象来实现DTO对象的时候,客户端必须按位置序号(在简单数组的情况下)或元素名称(在键控集合的情况下)访问集合内的字段。此外,集合存储的是同一类型(通常是最基本的Object类型)的对象,这有时会导致在编译时碰到一些无法检测到编码错误,这是采用内置集合对象来实现DTO对象的缺点。2.通过创建自定义类来实现DTO对象,通过定义显式的get或是set方法来访问数据。这种方式的主要优点在于能够提供与任何其他对象完全一样的、客户端应用程序可访问的强类型对象,这种对象可以提供编译时的类型检查;但是主要缺点在于增加了编码的工作量,因为如果应用程序发出许多远程调用的话,我们需要自己编写大量的调用代码。具体实现中有许多方法试图将上述这两种方法的优点结合在一起。第一种方法是代码生成技术,该技术可以生成脱离现有元数据(如可扩展标记语言(XML)架构)的自定义DTO类的源代码;第二种方法是提供更强大的集合,尽管它也是平台内置的一般的集合,但它将关系和数据类型信息与原始数据存储在一起,比如旧M提出的SDO技术或是微软ADO.NET中的DataSet就支持这类方法。无论采用上述的哪种方法,当有了DTO对象之后,就需要用数据来填充它。在大多数情况下,DTO内部填充的数据往往来自于多个其它种类的对象;由于DTO对象中很少有具体的数据操作方法,因此它很难从其它对象中直接提取数据。这种设计是有道理的,因为如果不让DTO对象知道如何调用其它对象的方法,我们就可以在不同的场合直接重用DTO对象,这样一旦其它对象发生更改,我们无需修改DTO对象的设计。这个BLOG上有对DTO模式更详细的一些讨论。这篇文章给出了.NET框架下对DTO模式的实现的例子数据访问模式4:离线数据模式离线数据模式是这样一种数据访问模式:以数据为中心:数据从数据源获取之后,将按照某种预定义的结构(这种结构可以是SDO中的Data图表结构,也同样可以是ADO.NET中的关系结构)存放在系统中,成为应用的中心。离线:对数据的各种操作独立于各种与后台数据源之间的连接或是事务。与XML集成:离线数据集所维护的数据可以方便地与XML格式的文档之间互相转换。独立于数据源:离线数据模式的不同实现定义了数据的各异的存放结构和规则,这些都是独立于具体的某种数据源的。现在,离线数据访问已经在不少产品中有了实现。WebSphere平台中的实现-SDO从WebSphereApplicationServerV5.1和WSADV5.1.1开始,WebSphere平台就对离线数据模式有了初步的支持,只是那个时候是称作WDO,现在在WebSphereApplicationServerV6中有了更充分的支持,而且它不光能够支持访问关系型数据源,还对XML以及其他类型的数据源的访问提供支持。JSR235forServiceDataObject这里可以找到SDO对应的业界规范的描述。这篇文章还是介绍WDO(SDO的beta版)的文章,不过其基本原理并没有太大的变化。在JDBCv3.0规范中支持的CachedRowSet已经部分地提供了离线数据模式的支持,下面这些链接给出了一些应用的例子:UsingCachedRowSettotransferJDBCQueryresultbetweenclassesUsingtheJavaCachedRowSetimplementationwithDB2UDB利用DB2UDB来使用JavaCachedRowSet实现断开连接除此之外,微软.NET框架下的ADO/ADO.NET技术也对离线数据模式提供了很好地实现:http〃wwwmicrosoftcom/china/MSDN/library/data/dataAccess/USdnhcvb04vb04h4mspx数据访问模式5:对象/关系映射(O/RMapping:Object/RelationMapping)这是另外一个非常热门的话题,在最近几年,采用OR映射的指导思想来进行数据持久层的设计似乎已经成了一种潮流,也因此出现了各种不同的潜在的工业规范和使用工具,这当中属JDO、Hibernate等最为有名。对象/关系映射的基本思想是来源于这样一种现实:大多数应用中的数据都是依据关系模型存储在关系型数据库中;而很多应用程序中的数据在开发或是运行时则是以对象的形式组织起来的。那么对象/关系映射就提供了这样一种工具或是平台,能够帮助将应用程序中的数据转换成关系型数据库中的记录;或是将关系数据库中的记录转换成应用程序中代码便于操作的对象。你可以在下面的一些链接中找到进一步的资料,相关的工具和开源项目很多,但在设计上却都有异曲同工之处,因此我们更需要关注地是它们在数据访问层的设计思想。/tim/archive/2004/09/16/1097.html飞鹰的BLOG中有不少文章对O/RMapping作了很好地分析和总结。/china/msdn/archives/library/dnbda/html/BOAGag.asp设计数据层组件并在层间传递数据,尽管这篇文章采用了微软系列的数据访问技术,但是对于Java应用同样有着不少借鉴作用。/这是Hibernate的官方网站。+回页首举例说明如何在典型场景中选择合适的模式与技术这里,我们选取了一个常见的电子商务应用-网上书城,并且从中分解出一些典型的应用场景,来分析,体会这些数据访问模式的不同。如下图(图6),这个网上书城的主要功能是提供在线的各种图书信息的查询,浏览,并且能够订购这些图书。图6:网上书城All557resultsforJ2EE:三|BeginningJ2EE1.4:From三|BeginningJ2EE1.4:FromMovicetoProfessiijnel(AuressBeginnerSeries)byJamesL.Weaver,etal(Paperback-February2004)Avg.CustomerRating:I:R.mte;thiw&「门)in24hcursSortby:|FeaturedItems1.J2E£14Usija11yshipsListPrice:$49.99Buy门巳叫:$33.99Used&门巳叫from$33.S3CureIWEEPettErns:BestPrmcticE、endDe&ignStretEgiESrSecondEditionbyDeepakAlur」etal(Hardcover)Avg.CustomerRating:[Rmte;this:itan-i]OtherEditions:Hmrcjuinu巳rUsija11yshipsin24hoursAlsoavailableforin-store口i匚kuptoday.Used&newfrom$27.S4ListPrice:$4M9Buy门巳m/:$34.99Ir-Atur巳Piikuu:$45.00任昭•.Ex口vrt。门—-on-。门巳JWEEDesignmndDbveI□口menl:(Progr己mmtrtoPropi•己mmer)P遂口byRodJohnson(Paperback)Avg.CustomerRating:[R.mtE:七卜姑此「门)这当中,我们分解出四种典型的情况,来看看如何选择合适的数据访问模式。Used&newfrom$27.S4书目查询用户根据查询条件查询相关的书目,返回符合条件的书目列表,这可能内容非常多,而且可能每次查询的内容都不一样。针对用户书目查询的应用,我们要区别不同的情况。如果查询返回的数据量并不是很大,同时并不频繁,可以考虑采用在线访问的模式;而如果返回的数据量较大(比如返回众多符合条件的书目并且分页显示)而且较为频繁,则可以考虑在线访问模式和离线模式相结合,通过离线数据的缓存来提高查询的性能。可以参考上一部分数据访问模式中在线访问和DAO方式访问部分的相关链接。批量更新管理员可能需要批量对这些书目信息进行修改,并且需要将更新返回数据库。这类数据应用的特点往往是与数据库交互的次数并不频繁,但是每次的数据量相对较大;同时,也希望能够使得本地操作有较好的交互体验。针对这种情况,往往适合采用离线数据访问的模式,DTO模式也是不错的选择。映射到具体的数据访问技术,如果之前采用的是旧MWebSphere平台,可以使用SDO技术,或者使用Java中的CachedRowSet技术;如果应用是基于微软的平台,则可以采用ADO.NET。可以参考上一部分数据访问模式中DTO方式和离线数据方式部分的相关链接。多用户并发访问网上书城的用户访问量越来越大,如何合理地规划有限的资源。如何让我们的应用能够处理大规模的并发用户访问是一个很复杂的问题,涉及到应用的架构、采用的软件、相应的配置、应用程序的调优等方方面面的问题。一个常见的方法是使用连接池的模式以便能够处理更多的用户请求。对于比较简单的应用程序,我们可以来实现自己的连接池程序;如果在你的应用中使用了应用服务器,比如旧MWebSphereApplicationServer,BEAWebLogic或是Tomcat等等,这些应用服务器都提供了连接池的机制。下面的链接提供了一些实现简单的连接池的指导,关于具体应用服务器中连接池的配置,请参考相关的产品文档。UsingDataSourcestheRightWay使用Java中的动态代理实现数据库连接他连接池,深入J2匚匚的连接含用整合异构数据源网上书城并购了其它同类的书城,需要将后台系统进行整合。因为有了新的不同类型的数据库系统的加入,需要和旧的数据库系统进行整合。后台数据系统种类繁多,配置复杂的情况是随处可见的。可能这个书城在刚刚起步的时候只是用了MSSQLServer2000来作为后台数据源;后来随着业务的增加,又有了新的DB2或是Oracle系统;除此之外,可能还有很多诸如XML文档等等需要和已有的系统集成起来,这些都是令人头痛的问题。在很多实际项目中,经常需要自己花很大的力气开发一些导入导出工具来集成数据,而现在已经有了专门的产品来做这件事情。旧MWebSphereInformationIntegrator(以前的DB2InformationIntegrator)就可以用来支持各种关系型数据源以及非关系型数据源的数据整合,本文不是专门来讨论这个产品,读者可以从下面的链接中得到与该产品以及相关解决方案的资料:组织跨多个数据源的J2匚匚开发WebSphereInformationIntegration~专题小结数据访问模式并不都是灵丹妙药,明确你需要什么,选择合适的模式,辅以适当的数据访问技术,才是最优的选择。参考资料http;///en/jsr/detail?id-54这是JSR54的主页,它是JDBC3.0的规范。/products/jdbc/index.jsp这是Sun的官方网站上JDBC相关技术的主页,你可以在这里找到与JDBC技术有关的各种技术文章和资源。http;//www-900ibmcom/developerWorks/cn/java/j-jdbcnew/indexshtml这篇文章介绍了JDBC3.0的一些新特性。/library/default.asp?url=/library/en-us/odbc/htm/dasdkodbcoverview.asp这篇文章简单地介绍了ODBC技术,并且提供了很多有用的链接。http;//msdnmicrosoftcom/library/defaultasp?url=/library/en-us/cpguide/html/cpconoverviewofadonet.asp这篇文章能够让你快速了解ADO.NET技术,并且有很多相关文章的链接。/javaworld/jw-03-2002/jw-0301-dao-p2.html这里介绍了一个非常不错的DAO模式的JDBC实现。http;//wwwmicrosoftcom/china/MSDN/library/architecture/patterns/esp/DesDTOmspx这篇文章提供了DTO模式的.NET实现。http;///en/jsr/detail?id=235JSR235,这里提供了SDO的JCP规范,目前正在工作中。/developerworks/cn/wsdd/library/techarticles/chenjunwei/wdoapp.shtmlWSADV5.1.1和WSADV5.1.2已经初步集成了SDO技术,你可以从这篇文章得到更为详尽的资料。10./developerWorks/cn/dmdd/library/techarticl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度员工解除劳动合同及离职后项目交接协议
- 少年儿童课外读物专门零售企业ESG实践与创新战略研究报告
- 钩针帽子企业ESG实践与创新战略研究报告
- 二零二五年度宾馆整体运营权及品牌授权转让协议
- 蔬菜制品流动零售企业ESG实践与创新战略研究报告
- 水生无脊椎动物类罐头企业数字化转型与智慧升级战略研究报告
- 2025年度校车接送服务及家长安全保障全面协议书
- 二零二五年度旅游党支部旅游市场开发合作协议
- 二零二五年度高原牧场雇佣放羊与生态保护基金合同
- 涂料专门零售企业县域市场拓展与下沉战略研究报告
- 安徽2025年安徽医科大学第一附属医院临床医技护理管理岗位招聘156人笔试历年参考题库附带答案详解
- 传染病习题库与参考答案
- 旅游景区股份合作开发协议书范本
- 2025年湖南信息职业技术学院单招职业技能测试题库参考答案
- 学情分析方案及学情分析报告范文
- 《CRISPR-Cas9及基因技术》课件
- 【博观研究院】2025年跨境进口保健品市场分析报告
- 游戏直播平台推广合作协议
- 《高科技服装与面料》课件
- 2025中国船舶集团限公司招聘高频重点模拟试卷提升(共500题附带答案详解)
- 土壤侵蚀与碳汇-深度研究
评论
0/150
提交评论