系统架构师论文-论软件三层结构的设计(备件采购项目)

论软件三层结构的设计

-备件采购项目

[摘要]

随着中间件与Web技术的发展,三层或多层分布式应用体系越来越流行。在这种体系结构中,将应用功能分成表示层、功能层和数据层三部分。 本人在去年参加了一个备件流程管理项目的开发,在此项目中担任需求分析和结构设计等工作。结合需求分析结果和该单位的实际情况,在该项目中我们采用C/S和B/S的混合模式,客户端使用的是Delphi和FrontPage进行开发,中间件我们采用的是COM+,使用Delphi进行开发,后台使用SQLServer据库。本文详细描述三层结构的设计过程,重点讨论中间件的设计过程和在设计实施过程中碰到的一些问题以及解决的方法,文章最后说明了采用三层 结构带来的效果,以及可以改进的地方。

[正文]

2003年8月,我参加了某钢铁公司备件采购项目,主要负责该项目的需求分析和结构设计等工作。该钢铁公司康先的备件采购全部是人工完成,手续复杂,办事效率低下,更重要的是无法提供及时有效的信息供企业领导参考。该公司一方面需要通过此项目来缩短采购时间,提高办事效率,另一方面该公司已经建成比较完善的局域网,需要在内部网上公开采购结果,并要做出统计分析,供全公司员工和领导查询参考。该项目涉及部门主要包括该集团 公司下的仓储公司,供应公司,招标公司,劳企部等。 根据我们做出的需求分析以及各种体系结构的优缺点,我决定采用C/S和B/S混合的体系结构来开发。対于仓储公司等部门的需求,需要対数据进行更新处理,采用C/S结构可以更快更好的开发且数据处理速度更快,可以更好的满足要求。対于领导和员工的查询需求,我们采用B/S模式。采取这样的结构可以很好的满足用户需求,且容易开发和维护。由于都是在windows平台上使用,因此在开发工具的选择上,我们使用Delphi来开发仓储公司等部 门的客户端和中间件,使用FrontPage来开发网页,连接在其内部网上提供查询服务。中间件我们采用的是COM+,进行逻辑处理,数据层使用SQL Server。 以下详细介绍三层结构的功能分配和物理分布,描述三层结构设计的过程,讨论在设计实施过程中碰到的一些问题以及解决的方法,文章最后说明采用三层结构带来的效果,以及可以改进的地方。対于客户端,B/S结构仅提供查询功能,使用Internet Explorer,各个子公司、二级部门都可以通过内部网使用。C/S结构提供日常操作和管理界面,承担着整个系统的数据录入及数据维护工作,使用Delphi开发,它是系统数据的入口,使用频繁,安装在仓储公司、供应公司等单位;中间件和数据库以及Web服务器都放在集团公司的计箕机中心,便于维护管理。中间件负责根据客户端要求从数据库中取得数据,并在进行处理后提交到客户端显示;后台使用SQL Server数据库,数据集中在数据库服务器进行管理,方便数据管理和分析,保证数据安全。其物理分布如下图:

対于C/S和B/S结构,我们分别使用不同的工具来开发客户端。C/S结构的客户端我们使用的是Delphi来开发,対于B/S的客户端我们使用的开发工具是FrontPage,采用VBScript脚本语言来开发。客户端只用来显示结果,所有的逻辑处理我们全部放在中间件中。在客户端只需引用中间件提供的接口即可,这样一个方面使逻辑处理集中,便于维护,另一个方面只向客户端提供处理后的数据,可以减少网络流量,加快反应速度。 対于中间件的设计是我们工作的重点。Microsoft的MTS/COM+不但能够稳定地执行应用系统的企业対象,以服务客户端的请求,更能够提供在分布式环境和异质数据库之间保护数据的事务管理能力。这让分布式应用系统能够稳定、可靠地在复杂的环境中正确地执行。再加上MTS/COM+能够有效地利用各种系统资源,増加中介软件的执行效率,因此使用MTS/COM+作为中介软件的应用系统能够提供合理的执行效率。 经过考虑,我们决定使用COM推为中间件来开发。如何设计出合理的中间件关系到项目的成畋。根据项目的特点,我决定根据不同的部门以及各个部门的需求来开发COM+组件。因为各个部门有不同的数据表,中间件主要处理的是每个部门各自数据处理和内部网上的查询以及统计分析处理,所以为每个部门设计了数个COM+组件,分别用来处理数据维护,查询操作以及统计分析工作-Delphi提供了MTS的向导可以帮助程序员开发COM+应用系统,程序员可以直接在COM+数据模块中放入ADOExpress组件来存取数据库,提高了程序员的工作效率。 但在开发过程中,也出现了不少的问题。比如在仓储公司维护更新工作的设计中,使用到多个数据库表,有些程序员直接使用MTS/COM+数据模块,然后在MTS/COM+数据模块中加入TADOConnection 连接数据库,再分别使用 TADOQuery/TADOTab 1 e 和 TOataSetProvider 组件连接到这些数据表。 从功能上说没有什么问题,但我发现这样设计存在一些问题。其中最大的问题就是执行效率的问题。这可以从数个不同的角度来看,首先程序员把所有的数据存取组件放在一个MTS/COM+数据模块中,因此当客户端建立这个MTS/COM+数据模块时需要花费许多的激活时间。 第二个问题是如果客户端只需要使用其中的一个数据表的数据,那么客户端仍然需要花费多余的时间建立不相关的対象。最后,対于MTS/COM槻供的Pooling机制而言,这样设计系统架构也是不好的,程序员应该尽量利用MTS/COM+提供的数据库连接Pooling的功能。因此最好是把每一个TADOConnection的连接放在不同的MTS/COM+数据模块中,因为这些数据表都位于一个相同的数据库中。 为了解决这些问题,我重新设计了这个架构。为充分利用MTS/COM+的数据库卽Pooling功能,并且避免客户端建立不必要的対象,我使用多个独立的MTS/COM+数据模块,其中分别放入TADOCOnnection、TADOQuery和TDataSetProvdier以连接到不同的数据表。这样的设计虽然比直接使用单一的MTS/COM+数据模块来得麻烦,但是无论在执行效率、系统的延展性以及资源的共享性上都比单一的MTS/COM+数据模块好得多。 为了更好的设计开发中间件,我対使用COM+做中间件来开发应用系统需要注意的一些问题做了总结:

  • 1、対于客户端而言,应该尽早取得需要使用的MTS/COM+对象,并且在最后使用完毕之后再释放取得MTS/COM+对象。
  • 2、避免激活不必要的事务Conmmit。対于MTS/COM+对象而言,应该让事务管理越晚发生越好,并且在执行完必要的工作之后立刻调用SetComplete/SetAbort和EnableCommit/DisableCommit方法释放占据的资源。尽量把相关的MTS/COM+对象放在同一个套件组件中,尽量减少不同套件组件之间MTS/COM+对象的调用。
  • 3、在MTS中使用STA线程模型的対象,在COM+中使用Neutral/Rental线程模型的対象。
  • 4、尽量利用MTS/COM+对于数据库的Pooling而不要使用主从架构的方式来利用数据库Pooling通过使用这些方法在开发过程中我们大大改进了系统的执行效率。 数据层使用一台数据库服务器,通过企业局域,分布在仓储公司等单位的工作站利用客户端软件进行数据录入及维护工作,在各个二级分厂、单位的客户端都可以通过内部网进行查询浏览。我们采用的是SQL Sewer数据库,功能强大,使用方便,完全满足系统的要求。 最后通过项目组成员的努力,我们按期完成了任务。采用这样的体系结构,完全满足要求,并且安全可靠、容易维护、扩展方便、结构模块化、易操作。经过用户一段时间的使用,基本上没有什么问题。在后期的维护中,我们対中间件和客户端分别做了少许修改,但二者之间没有互相影响,这些充分体现出多层结构的优越性。当然在其中也存在一些问题。比如在系统的执行效率和延展性上,给人的感觉是多层应用系统的执行速度有点慢,还有组件的设计上还存在些问题。这些问题在了解COM+的设计方法和系统需求后才能更好的解决。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AustinDatabases

PostgreSQL 唯一约束与唯一索引 是一个人吗?

大部分数据库表都有一个承接的功能就是某个表每条记录的唯一性,通过唯一性来保证这张表的数据是不重复的。使用的场景很多,例如银行,每个人只能开一个1类账户,怎么来保...

9320
来自专栏小海怪python学习

Django学习-第十三讲(下):表单(一)forms.form、forms.modelform

单纯从前端的html来说,表单是用来提交数据给服务器的,不管后台的服务器用的是Django还是PHP语言还是其他语言。只要把input标签放在form标签中,然...

13530
来自专栏一名白帽的成长史

【SQL注入】关于报错注入的一些测试

我们这里使用sqli-labs靶机来进行测试,这是一个练习sql注入的专用靶机,如下:

6720
来自专栏小海怪python学习

Django学习-第九讲:聚合函数,F、Q表达式

如果你用原生SQL,则可以使用聚合函数来提取数据。比如提取某个商品销售的数量,那么可以使用Count,如果想要知道商品销售的平均价格,那么可以使用Avg。 聚...

9340
来自专栏小海怪python学习

Django学习-第六讲(下):django数据库的ORM操作方法及常用字段

1.SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长。会出现很多相近的SQL语句。

6420
来自专栏小海怪python学习

Django学习-第七讲:django 中的常用字段、字段属性,外键和表关系、外键操作

映射到数据库中是int类型,可以有自动增长的特性。一般不需要使用这个类型,如果不指定主键,那么模型会自动的生成一个叫做id的自动增长的主键。如果你想指定一个其他...

8730
来自专栏小海怪python学习

Redis介绍

随着互联网+大数据时代的来临,传统的关系型数据库已经不能满足中大型网站日益增长的访问量和数据量。这个时候就需要一种能够快速存取数据的组件来缓解数据库服务I/O的...

10220
来自专栏小海怪python学习

Django学习-第十一讲(上):ORM迁移命令

将模型生成迁移脚本。模型所在的app,必须放在settings.py中的INSTALLED_APPS中。这个命令有以下几个常用选项:

11020
来自专栏小海怪python学习

Django学习-第十四讲:文件上传、cookie、session、memcached

1.在前端中,我们需要填入一个form标签,然后在这个form标签中指定enctype="multipart/form-data",不然就不能上传文件。

9040
来自专栏小海怪python学习

Django学习-第十讲(上):QuerySet API 学习

我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作。其实模型名字.objects是一个django.db.models.manager....

8820

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励