摘要
了的Pet Shop 企业版本是怎样帮助企业解决实际中的业务问题Net Pet Shop
验证了怎样利框架和Visual 来开发最佳的企业级系统就如Sun公司的Java&#; Pet Store JEE&#; Blueprint application它也是一个最佳的系统实现
介绍
NET 宠物店程序开发于年月它描述了Net开发者怎样利框架和Visual 开发最佳的系统下面关于宠物店和原来的JEE宠物店的讨论涉及了企业级系统的一些特性如可靠性和伸缩性对于一个系统要部署成企业级一定要考虑它的安全性可靠性可伸缩性可管理性以及与已有的系统和数据进行协同的工作以前版本的宠物店系统所表现出来的成本优势性能和开发效率在Net平台上仍然存在本文通过描述了Net支持的其他的企业级需求从而把宠物店的讨论引向深入
许多企业都有他们存在于不同系统中的分布的数据比如存货数据在一个存货控制系统中而客户资料数据却在他们的CRM系统中我们的系统需要处理这些不同数据库中的数据并且保证数据的更改在这些系统中正确进行要达到这些要求我们需要跨数据库的事务处理
宠物店企业级版本是为了展平台上的技术可以很好的支持那些企业级系统的特性它在处理现实世界中存在的数据存储方面提供了一个可靠的可伸缩的系统宠物店企业级版本处理这样的一些情形如客户数据存在于一个服务器上的客户数据库系统中而客户定单数据存在于物理上不同的服务器上的一个不同的数据库系统中这样的情形在许多机构中是一个普遍的现象
为了保证客户数据和客户定单数据永远是正确的需要一个包含这两个数据源的分布式系统本文讨论了企业级系统中处理事务的不同机制给出了每种机制的示例代码讨论了一些最佳做法本文中的代码是用c#写成的但所有的方法和技术一样适用于
本文所讨论的跨多个数据库的分布式事务对于一个系统来说早已被证实具有优良的性能和伸缩性这里还测试平台上的几种事务机制的性能详细的列举和描述了它们的结果从这些结果中我们可以清楚的看从功能上和性能上都提供了优秀的企业级事务支持
本文还包含了宠物店的一些介绍它的初始架构和实现以及为了支持企业级特性对它的一些改动还详细讨论了不同的事务方式和他们的测试性能结果图
请参阅how Sun Microsystems Java Pet Store JEE BluePrint Application was implemented using Microsoft NET
假设的情景
假设一个可以在线订购宠物的电子商务企业当你进入系统后你可以浏览查询从犬类到爬行动物的各种类型的宠物
一个典型的宠物店系统包括
◆ 主页 当你打开系统后载入的页面
◆ 类别浏览 –顶层有五种类别每种类别下面都有若干产品
◆ 产品 –当系统里面的一个产品被选种时产品的属性就被显示出来典型的如公或者母
◆ 产品明细 –每种产品属性的详细说明如照片价格和库存数量
◆ 购物车 –允许客户去维护一个购物车(增加删除更新数量)
◆ 校验 –只读地显示一个购物车信息
◆ 登录定向 –当用户在校验页面上选择继续的时候如果他还没有登录则会定向到登录页面
◆ 验证登录 –当登录被验证后就会转到信用卡信息和订购地址信息页面
◆ 确认定单 –定单和客户地址信息被显示出来等待确认
◆ 提交定单 –最后的一个步骤在这里定单被提交到数据库
宠物店的一个例子如图
图Net宠物店Net宠物店的总体逻辑架构如图
图Net宠物店逻辑架构有三个逻辑层表示层中间层数据层这三层可以使不同特征的分布式系统进行清晰的部署逻辑层被装成一装配(用C#类库实现)对数据库的访问是用一个类来处理所有的与SQL Server Managed provider的交互用存储过程来存取数据这个系统利用实现了完全的逻辑上的三层架构表现平台上的最佳实践
图Net宠物店系统的物理部署图程序架构
图是用来表现我们的设计的详细图我们可以看到宠物店每层的实现和交互细节
图架构设想 数据库
数据库有如下的表
表格数据库表名Net宠物店的事务实现
原有宠物店中Order类的addOrder方法所调用的存储过程中用到了数据库事务这个调用涉及到了四个表的数据需要定义ACID属性因为如果一个定单被创建库存数据需要被调整存储过程利用了一个xml文档做参数插入定单数据定单明细插入定单状态数据更新定单里涉及到的产品的库存数据我们的目标是从单一数据库架构变为分布式数据库架构也就是客户产品和库存数据存在一个数据库里面定单存在于另外的一个数据库中为了达到这个目标我们需要转移到一个企业服务型架构这是唯一的一种可以控制分布式事务和提供两阶段的提交的机制为了转移到企业服务级我们需要考察几种情形的影响
◆ 引入企业服务类库但是用数据库事务/ADONET事务
◆ 引入企业服务类库利用它来控制事务
◆ 引入企业服务类库利用它来控制分布式事务
为了实现分布式事务我们需要修改addOrder方法和数据库交互的方式在单一的数据库情形下我们利用了一个存储过程对于分布式我们需要变为两个存储过程每个数据库一个我们意识到原先的存储过程在最后表之间用了连接现在这些表存在于不同的数据库中所以我们最好还是把这些实现放到中间层中用动态生成SQL语句
为了显示引入企业服务类库对于每个组件的影响我们设计宠物店的几个版本
◆ 用最初宠物店v作为基础
◆ 利用ADONET事务宠物店
◆ 使用企业服务类库和ADONET事务(企业服务的事务属性设置为不支持)
◆ 利用企业服务的事务(事务属性在Order组件被设置为需要ADONET的事务去掉)
◆ 利用企业服务来处理分布式事务
分布式情形下的数据库设计
图宠物店数据库模型 图定单数据库模型Net的事务机制
Net开发者可以使用四种机制
◆ 数据库事务
◆ ADONET事务
◆ ASPNET事务
◆ 企业服务级事务
每种机制在以下的几方面有各自的优势和劣势性能代码数量部署设置许多开发者都很熟悉数据库的事务在这种情形下中间层调用数据库的存储过程存储过程中开始一个事务如果每个语句都执行成功则提交如果有错误发生时就会回滚
如果你的事务需要几个调用例如你需要插入多个定单明细到一个表中但不想用一个xml文档或者传递一个很长的字符串这些都需要在存储过程中被解析你可以用ADONET事务机制ADONET事务允许你在当前的连接上创建一个事务上下文运行对数据库的多次调用在最后或者提交或者回滚
ASPNET事务是在Web应用程序的页面层工作你只要简单的在页面属性中加一个 Transaction=Required这样在页面中的事件处理都作为页面整个事务的一部分任何处理出现错误则所有的处理都将回滚
企业服务型组件通过资源管理器和分布事务控制器(DTC)来实现事务当ASPNET一个数据库的调用或者事务中涉及到的其他资源发生错误或者异常时整个事务将被回滚企业服务建立在COM+技术的基础上来处理事务熟悉COM+的开发者应该理解企业服务
应该被提到实现一个事务的这些不同方式之间可能是互斥的如果你混合使用数据库事务和企业服务事务你就会得到一个错误这是因为你会得到重复的提交你在企业服务中可能提交一个在数据库事务中已经提交了的事务这样已经没有事务上下文来进行提交动作了同样的问题如在数据库事务中提交了一个事务但在企业服务中却因为在系统中发生异常而回滚
(未完待续)