CSDN博客

img wildhorseli

设计数据层组件及各层间数据流通(3)

发表于2004/6/25 10:43:00  1078人阅读

实施数据存取逻辑组件

数据存取逻辑组件是无状态的类,这就意味着所有的消息交换是独立进行释解的。在调用中没有状态会被保持。数据存取逻辑组件提供方法来取得单个数据库单表或关系表,或在某些情形下,多个数据库作为水平数据库分割开的情况。典型地,数据存取逻辑组件的方法调用存储过程来执行它们的操作。

数据存取逻辑组件的一个关键目的就是隐藏调用和在调用的应用中安排数据库特性的格式。数据存取逻辑组件对应用提供了封装的数据存取服务。特别需要指出,数据存取逻辑组件处理上实施以下细节:

·                        管理和封装锁的方案

·                        恰当的处理安全和授权问题

·                        恰当的处理事务

·                        执行数据内存页面调度

·                        在需要的情形下执行数据依赖的行程

·                        没有事务的数据,恰当的实施缓存策略

·                        执行数据流和数据序列化

接下来的章节会更具体的研究这些问题

使用数据存取逻辑组件的应用场景

实施数据存取逻辑组件

数据存取逻辑组件使用ado.net执行sql 语句或调用存储过程。对于数据存取逻辑组件的例子,见附录的如何定义一个数据存取逻辑组件。

如果你的应用中包含多个数据存取逻辑组件,你可以使用数据存取helper最近来简化实施数据存取逻辑组件。该组件可以帮助管理数据库连接,执行sql命令和缓存参数。数据存取逻辑组件仍然需要封装逻辑去存取特定的业务数据,尽管数据存取helper组件集中了数据存取api和数据连接配置来减少重复代码。微软为.Net提供了数据存取应用块:http://msdn.microsoft.com/architecture/application/default.aspx?pull=/library/en-us/dnbda/html/daab-rm.asp 当你使用微软sql server数据库是该工具可以用来生成数据存取helper组件。图6展示了如何使用数据存取helper组件来帮助实施数据存取逻辑组件。

5 展示了一个数据存取逻辑组件是如何被不同的应用类型来调用的,其中包括windows forms applicationsasp.net application, xml web services 业务处理。 这些调用可能是本地或远程,主要依赖与如何配置你的应用。

如果这有多个相似功能的数据存取逻辑组件,你可以定义一个基类用来集成和扩展。

在设计数据存取逻辑组件时,对不同的客户类型提供的接口。如果设计的数据存取逻辑组件和当前的需求及潜在的业务处理层实施需求兼容,就可以减少附加的而必须实施的接口,外观或映射层的数量。

为支持各种业务处理和应用,需要考虑以下的技术来流通数据和数据存取逻辑组件方法。

·                        把业务实体的数据流通放到数据存取逻辑组件方法中。你可以通过不同的格式来流通数据:序列化标量值,xml串,dataset,或定制的业务实体类。

·                        通过数据存取逻辑组件方法返回业务实体。 同样你可以返回不同格式的数据:你可以通过不同的格式来流通数据:序列化标量值,xml串,dataset,或定制的业务实体类或data reader.

接下来章节描述不同的选项即每一个选项的优缺点。这些信息会帮助你做一个选择基于你的应用场景。

通过标量值作为输入和输出

这个选择有如下优点

·                        抽象 调用者必须知道定义得以业务实体的数据,而不是指定的类型或指定的业务实体结构。

·                        序列化 标量值原生的支持序列化。

·                        有效使用内存  标量值仅仅在需要的情况下传输数据。

·                        性能  当处理实例数据时,标量值能别其它要有好的性能

接下来是其缺点:

·                        紧耦合和维护。 Schema 改变后需要相应的方法改变。

·                        实体集合   数据存取逻辑组件保存或更新多个实体,必须分开方法来调用。这将会对分布式环境中造成重大性能打击。

支持乐观的并发。 为了支持乐观并发,时间戳字段必须在数据库中被定义并作为数据的一部分。

通过xml串作为输入和输出

该选项有点:

·                        松耦合   调用者必须知道所定义的业务实体,并且schema为业务实体提供了元数据

·                        集成   接受xml有多种方式支持,比如,.net 应用,bizTalk 规则,及第三方的业务规则。

·                        业务实体集合  一个xml串可以包含多个业务实体

·                        序列化  串原生的支持序列化

该选项缺点

·                        Xml串的解析 xml串在接收时必须被解析。非常大的xml串的解析会引发性能费用。

·                        内存使用低效  xml串若冗长,会引发低效的内存使用

·                        支持乐观并发   为了支持乐观并发,时间戳字段必须在数据库中被定义并作为xml数据的一部分。

通过datasets作为输入和输出

该项优点如下:

·                        原生功能    支持复杂数据结构创建功能处理乐观并发。另外,支持数据校验。

·                        业务实体集合  被设计用来处理集合和复杂关系,不需要写自己。

·                        维护  schema修改不影响方法标识。但如果使用强名,在新版时需要重新编译。

缺点如下:

·                        性能     实例化和编组dataset引发运行时间费用

·                        单个业务实体  dataset被设计用来数据集合。若用单个其它方式比用dataset要好。

 通过定制的业务实体组件作为输入和输出

优点如下:

·                        维护

·                        业务实体集合

缺点如下:

·                        支持乐观并发

·                        限制集成

返回Data reader作为输出

优点如下

·                        性能 当需要快速提供数据时有性能上的优势,你可以在表示层代码中配置你的数据存取逻辑组件

缺点如下

·                        远程 如果使用远程场景那就为下策了,因为存在潜在的客户应占用打开的数据连接较长的时间。

数据存取逻辑组件使用存储过程

你可以通过数据存取逻辑组件来使用存储过程来执行许多的数据存取任务

优点

·                        存储过程生成结果能提高性能,因为数据库可以通过过程和缓存计划来优化数据存取计划。

·                        在数据库中,存储过程可以相对对立安全。管理员可以给用户授权来执行存储过程。

·                        存储过程可能更容易维护,因为修改存储过程要比修改在配置组件中的硬编码的sql语句来的简单。

·                        存储过程在数据库schema下的增加了附加的抽象等级。存储过程的客户从实施存储过程的细节中分离出来。

·                        存储过程可以减少网络阻塞。Sql语句可以批量执行,而不需要应用发送大量的sql请求。

尽管有以上如此多的优点,但这儿也有不适合或不推荐使用存储过程的地方

缺点

·                        应用卷入外在的业务逻辑和处理可能在服务器上增加负载,特别是把所有的逻辑都放到存储过程中。例如处理类型包括数据迁移,数据往返移动,数据转化和内在的计算操作。你应该把这些放到业务处理或数据存取逻辑组件,这样更有扩展性。

·                        不要把所有的业务逻辑都放到存储过程中。当你需要在T-sql修改业务逻辑时,维护和应用的灵活性会成为一个问题。例如,独立软件开放商可以支持多个RDBMS不会为每个系统维护分散的存储过程。

·                        写和维护存储过程通常需要特别的技巧,这并不是所有的开发人员都拥有的。这种情况可能在项目开发表带来瓶颈。

数据存取逻辑组件使用存储过程的建议

在数据存取逻辑组件使用存储过程时,考虑到以下的建议:

·                        展示存储过程   数据存取逻辑组件应该是唯一的展示数据库schema信息的组件,比如存储过程的名字,参数,表和字段。你的业务实体实施应该没有数据库schema信息或不依赖于数据库schema

·                        用数据存取逻辑组件管理存储过程   每一个存储过程仅能被数据存取逻辑组件调用和关联。例如,设想客户给一个零售商下了订单。你应该写一个存储过程命名为 OrederInsert,在数据库中创建一个订单。在你的应用中,你必须决定是从客户数据存取逻辑组件调用还是从订单数据存取逻辑组件调用存储过程。订单数据存取逻辑组件要好一些,以为它处理所有的订单相关的操作(客户数据存取逻辑组件处理客户信息,比如客户的名字和地址)

·                        命名存储过程 当你为数据存取逻辑组件定义一个存储过程,选择的名字要强调适合数据存取逻辑组件。这样的命名习惯能更容易确定使用的哪个存储过程。例如,CustomerInsert, CustomerUpdate, CustomerGetByCustomerID

·                        表面安全问题 如果你接受用户录入执行动态查询,不要不使用参数通过连接值创建串。如果你使用sp_execute 来执行结果串或你不利用sp_execute sql 参数支持的优点,避免在存储过程中使用串连接(concatenation)。

管理锁和并发

锁和并发大家应该非常熟悉,这段我就自己简单的描述一下,而没有遵从原文去翻译。有两种方式管理锁和并发。悲观并发和乐观并发。这儿有几种测试乐观并发的方式

·                        使用分布式的时间戳    在字段中加一时间戳,查询时取得时间戳,更新时比较时间戳。

·                        维护一个原来数据值的备份     首先得到一个查询原值,更新是用备份数据比较。

·                        DataSet 有原值,更新是可以使用data adapter   来执行乐观并发检查

·                        使用中央时间戳   定义一个时间戳表,为所有的更新写日志。本身也能提供审核的功能。

使用Data adapters datasets 实施乐观并发

对于DataAdapterDataAdapter.RowUpdated写乐观并发检查;在存储过程中有大量的sql语句时,为了性能原因选择SET NOCOUNT ON选项。这个选项不对每个语句返回消息,减少网络阻塞。但这样你不能检查RecordsAffected属性,因为它总是-1。但你可以返回@@ROWCOUNT,因此在更新时你可以指定@@ROWCOUNT作为返回值。

实施业务实体

业务实体有以下特征

·                        业务实体提供了有状态的能力存取业务数据

·                        业务实体可以从复杂的schema创建,比如可以是多个关联表的数据

·                        业务实体可以作为业务处理过程中I/O参数的一部分来流通

·                        业务实体可以被序列化,维持目前实体的状态。例如,应用可以把实体数据保存到本地硬盘上,或桌面数据库中如果应用离线工作或是一个消息队列的消息。

正如以前所提,有多种方式来表示业务实体:

·                        普通的dataset

·                        Typed dataset

·                        定制的业务实体组件

·                        定制的含有CRUD行为的业务实体组件

接下来描述如何表示每一种业务实体,为帮助你决定在你特定的环境下如何选择最恰当的表示方式,以下章节描述每个业务实体格式如何执行以下任务

·                        组织业务实体集合

·                        数据绑定到用户界面控件

·                        序列化业务实体数据

·                        各层流通业务实体数据

同时会考虑非功能需求,包括性能,效率,扩展性,伸缩性

xml表示业务实体

以下的例子使用xml表示一个简单的业务实体 产品

<?xml version="1.0"?>

<Product xmlns="urn:aUniqueNamespace">

<ProductID>1</ProductID>

<ProductName>Chai</ProductName>

<QuantityPerUnit>10 boxes x 20 bags</QuantityPerUnit>

<UnitPrice>18.00</UnitPrice>

<UnitsInStock>39</UnitsInStock>

<UnitsOnOrder>0</UnitsOnOrder>

<ReorderLevel>10</ReorderLevel>

</Product>

使用xml表示业务实体时,考虑以下准则:

·                        决定是否xml文档应该包含当业务实体或是业务实体集合

·                        使用唯一的命名来鉴定xml的元素,避免冲突

·                        为每个元素和属性选择合适的名字。就是命名要有意义

·                        使用以下的方式来取得业务实体

·                                      若你使用sql Server2000 你可以在你的查询或SP中使用for xml 语句。根据性能测试,使用for xml 要比返回dataset来的快。

·                                      取得dataset并且转化它或把它写成xml流的形式。

·                                      通过输出参数或使用data reader创建xml 文档。 Data reader 是从数据库读取多条记录的最快方式,但创建xml过程会降低性能。

Xml格式作为业务实体的优点

·                        标准支持。 W3c

·                        弹性

·                        互用性  比如asp.net windows formdataset

 

缺点:

·                        类型失真   仅仅是个串,当然你可以使用xsd schema

·                        校验xml  为了校验,你需解析代码和使用xsd schema。这些速度都相当慢

·                        显示xml      不能自动的展示xml数据,需要写xslt格式来转化到dataset。并且样式表不容易写。

·                        解析xml    你需要DOMxmlreaderxmlreader仅提供了快速向前的,只读来读取xml数据。Dom要强大,但速度慢。

·                        Sorting  xml      要使用以下方式

·                                      按照编码递交数据

·                                      xslt样式表动态sort数据

·                                      xml数据转化到dataset

·                        使用私有字段 你没有选择来隐藏信息

使用普通dataset表示业务实体

优点

·                        弹性

·                        绑定

·                        排序和过滤

·                        xml转化能力

·                        可用的元数据

·                        乐观并发

·                        扩展性

缺点:

·                        性能

·                        私有字段

使用typed dataset表示业务实体

优点:

·                        可读性

·                        编译类型检查

缺点:

·                        配置

·                        支持com+

·                        扩展性问题

·                        实例化

继承

定制业务实体组件

有以下成员

·                        私有字段

·                        公用属性

·                        方法和属性

·                        事件

考虑以下建议

·                        选择structsclass

·                        表示业务实体状态

·                        含有子集合,有两种表示方式

·                                      Arraylist

·                                      Dataset

·                        数据绑定

·                        使业务实体能序列化的

·                                      Xml 序列化

·                                      二进制序列化

优点:

·                        可读性

·                        封装

·                        复杂系统模型

·                        本地校验

·                        私有字段

缺点:

·                        业务实体集合

·                        序列化

·                        表示复杂关系和层次

·                        查询和排序数据

·                        配置

·                        支持com+

·                        扩展问题

定制业务实体组件 含有CRUD()

几个建议

·                        如果应用主要是集合,需要排序,查询,对家用dataset,如果应用使用实例数据,标量值更好些

·                        应用主要使用实例数据,定制的业务实体可能是最好的选择

·                        大多数情况下,设计你的应用使用数据为中心的格式,例如xml文档或dataset。你可以使用原生功能,减少代码量。

关于事务,请见我的ado.net处理事务

0 0

相关博文

我的热门文章

img
取 消
img