从MVC与三层架构谈到优化架构提高Web效率

上次炮轰过了MVC,今次又来炮轰三层架构,感觉自己像是在到处贴大字报的红卫兵^_^,不过理不辨不明,希望我的砖头能引来更加精辟的阐述。
    说道3层架构,MVC其实是因为看到某男给我看他的概要设计书引出来的,因为此君很能够代表很多的刚入门的开发者,他所经历的误区,可能很多开发者都会经历(也包括我自己,当年干过很多傻事)。从历史沿革上来说,MVC和分层设计是没有交集的,很多时候很多人会觉得这样也好,那样也好,于是就把两个概念混淆起来,于是某君的概要设计书就写成这样子:
......本系统是典型的3层架构设计,采用MVC模式......
    这里不是说3层不好或者是MVC不好,不过起码需要先搞清楚何为3层,何为MVC才能说两者能不能结合起来或者怎么结合起来,不过在这个ORM(其实ORM也是个概念而已,不管你是代码生成器,组件还是自己动手写)横行的年代,3层的意义已经被淡化了。我们首先来看看3层架构的概念是怎么回事。一般意义上的3层就是表现层,业务逻辑层,数据操作层。没层之间是一种垂直的关系,换言之可以很直观的表现在很厚的调用栈上。其实是从网络分层的概念上借用来的。在网络每个层次都是一个协议栈,上层协议和下层协议因为层次间的接口的稳定而存在一种弱耦合的情况,上层协议是不会关心底层协议是什么的。所以程序上的3层架构就是为了实现弱耦合而出现的,对于页面来说业务逻辑的实现是透明的,对于业务逻辑来说,数据操作的细节是透明的,然后可以分开让不同的程序员去实现。so,看起来是个不错的馅饼,不过面临的问题也很简单,长长的调用栈,效率的降低,和扩展的复杂,每次扩展功能我们都需要重新编译部署整个业务逻辑层的Dll,和Site,但是这时要看适用范围的,很多时候,网站的逻辑都是相当的简单的,读表,填充Grid完毕。这样子的逻辑都要在业务逻辑里跑一次,其实协议个方法出来里面却只有一行,或者几行代码,其实就是转发一下数据层的结果。老实说如果是做个新闻发布的系统的话,业务逻辑层几乎通篇都是转发的代码,结果当修改了数据库的时候还要多改几个地方,简直是没事找事啊。还有种情况就是大量使用存储过程,逻辑都在存储过程里去了,结果业务逻辑层武功尽废,彻底沦为一个传声筒。有人说可以在这里验证数据阿,看来也就这点事情了,犯得着写一层膜嘛,是男的都知道多层膜不爽,那你为什么还要用?
    再来看MVC,虽然上次炮轰过MVC(MVP),不过相对千层饼来说,MVC还是要可爱得多。起码更加符合实际情况一些,对于Web来说也比分层更加的合理,MVC是典型的平行关系,没有说谁在上谁在下的关系,模型负责业务领域的事情,视图负责显示的事情,控制器把数据读取出来填充模型后把模型交给视图去处理。而各种验证什么的应该是在模型里处理了。在Web下稍微修改一下也还是比较自然的。很多人把MVC,多层混合起来用,在没搞清楚的情况下很容易就高的不伦不类,其实这个倒不重要,主要是效率和灵活性都降低了,那才是致命的问题。
    Web应用程序执行的效率相关的因素很多,我们这里只来看看架构的改变对数据库操作的影响。
     一种是多层的,每个业务对象都有自己的数据连接,然后造成了什么后果呢,在一个页面上依次打开关闭了N次数据库连接,而这些都是有消耗的,而Web并不是一个用户使用,加入一个页面上有10个连接,同时1000人访问就会在短时间内造成10000次数据库连接开闭的操作。还有一种是趋向单数据库连接(之前有位老兄在http://www.cnblogs.com/ayuan/archive/2007/03/24/686594.html 这篇POST里提过,不过貌似那位老兄把IIS的连接数限制概念搞错了,回头我再去提醒他)。其实这个也是不可取的,这样子会造成在多人访问的时候效率严重下降,因为始终只有一个Connection,在很多人请求的时候就会排起常常的挂起队列,得不偿失。其实我们仔细分析一下Web的工作模式的时候就会发现,首先,对于整个Web应用程序来说,是一个多线程环境,每个Session都有一个工作线程去Handle,每个线程都是隔离的,只有Application是线程间的公共区(所以就算是ASP都对Application提供了Lock和unlock机制,why?线程安全那),但是我们的代码除了静态的部分都是针对每个Session的,所以就这点来说,我们的程序可以看作是单线程的(除开Application和静态相关的代码)。那么其实我们针对每个Session之需要有一个Connection就能达到最优化Connection资源的目的,但是很多时候这样子会牺牲整个站点的结构,而且还有个问题在这里,如果在Session里一直存个打开的连接的话,如果这个用户的Session不回收就无法关闭连接,这个时候就是说,50个用户就要占用50个连接,一般来说SqlServer的连接数是有限的,到时候就不是慢的问题了,再有用户进来就没连接可用了,所以我比较倾向于每个页面放一个Connection,在初始化页面的时候打开,在执行页面结束的时候关闭,这个样子基本上就能达到效率的最优化了,至于业务逻辑我倾向于平行化,成为一系列逻辑的Helper类,里面只处理领域模型(MVC的M,实体类or DataSet),数据操作还是在Controler里,要换数据库怎么办?现在DAAB3.1还有N多的ORM都是支持多数据库的,这里就不用操心了。

继续给自己的组件打广告:
http://www.cnblogs.com/Alexander-Lee/archive/2007/03/30/694049.html  带缓存的哦,巴适得很哦

posted on 2007-03-31 11:25 亚历山大同志 阅读(22534) 评论(72)  编辑 收藏 网摘 所属分类: 随笔

评论

#1楼  2007-03-31 12:13 liudao      

我一直认为熊掌与鱼翅不能兼得
有些时候开发效率要比性能重要的多

这里有好多三层的例子,我觉得还不错

http://51aspx.com/Tags/2

也验证一下楼主的说法   回复  引用  查看    

#2楼  2007-03-31 12:42 航天奇侠      

不明白。 多层结构本身就是为了扩展的容易而设计的,将需要改动的内容限制在某一个层,为何博主要说改动不方便呢?
  回复  引用  查看    

#3楼  2007-03-31 12:53 eBay      

You really like a Red Guard!!!

首先,三层架构或者N层架构的起源并不来源于你所谓的“新闻发布的系统”的网站。

其次,针对你要求的网站开发,根本就不会使用你所描述的这些方法。即使采用你的方法,每个页面都有一个connection,那么很难想象你的硬件能够支撑多么大的pv。市面上所有alex排名在10000以内的网站都关门算了。另外,你可以想象你这种架构下代码的自注释能力有多差。

再次,即使你需要实现one pv, one connection,n tier structure一样可以满足这种需求(即使它很stupid)

OO是经过时间检验的方法论,由此衍生出的众多思想方法依然只能是仰望。无知者无畏地把邓公打倒在地,再踩上一只脚,并不能显得你很酷。红卫兵这个比喻真是贴切。这是整篇文章最具备可读性的一句话。

最后解释一句,并不是对你个人有成见,只是有感于近期的博客园首页内容质量。很多年轻人都开始热衷于写些文章,本非坏事,只是在确保你的文章可读之前,最好掂量掂量?   回复  引用  查看    

#4楼 [楼主] 2007-03-31 13:05 亚历山大同志      

@eBay
希望你看清楚我的Post再作发言,
[三层架构或者N层架构的起源并不来源于你所谓的“新闻发布的系统”的网站。]
或者是你语文能力的问题,用新闻发布系统来做例子只不过是用来说明对于一些逻辑比较简单的Application而言所带来的问题。

[代码的自注释能力],不知所谓,所谓自省不是放到这个领域来说的事情。

每个页面一个Connection,和每个Session一个Connection还是一个程序就一个Connection,你总要提出你的观点,我看你才是红卫兵,打倒作数不说理由。我在文章里已经分析的很清楚了,把Connection的作用范围在哪一个区间有什么样的问题。

请你在理论上时间上清晰地用事实驳倒我,而不是
[市面上所有alex排名在10000以内的网站都关门算了]

所以在你回Post前[最好掂量掂量?]
  回复  引用  查看    

#5楼 [楼主] 2007-03-31 13:10 亚历山大同志      

@eBay
还有就是alex前1000强的网站都是你家亲戚?   回复  引用  查看    

#6楼  2007-03-31 13:11 Clark Zheng      

“所以程序上的3层架构就是为了实现弱耦合而出现的”

个人认为三层结构并不是为了实现弱耦合而提出来的。


“每次扩展功能我们都需要重新编译部署整个业务逻辑层的Dll,和Site”

个人认为这是由于你的设计出了问题。   回复  引用  查看    

#7楼  2007-03-31 13:12 Lucifer [未注册用户]

"所以我比较倾向于每个页面放一个Connection,在初始化页面的时候打开,在执行页面结束的时候关闭,这个样子基本上就能达到效率的最优化了"

这样的东西放在公网上,会死得比较惨   回复  引用    

#8楼 [楼主] 2007-03-31 13:17 亚历山大同志      

@Lucifer
那你认为应该如何,一个Session一个connection还是一个Application一个?
  回复  引用  查看    

#9楼  2007-03-31 13:17 eBay      

@亚历山大同志
呵呵,惹着了?那就先跟小朋友道个谦。

好吧我就总结一下你的文章看看是不是我语言能力有问题。

你首先抛出来的论点:“很多逻辑比较简单的网站,不需要三层或者多层架构”
论证是:“长长的调用栈,效率的降低,和扩展的复杂,每次扩展功能我们都需要重新编译部署整个业务逻辑层的Dll,和Site”...

接下来的论点是:“相对千层饼来说,MVC还是要可爱得多”论证过程就那么一段。

再然后继续批多层:“每个业务对象都有自己的数据连接...”
结论是效率差。

最后给出了你的解决办法: 每个页面一个Connection............

多的话不说,大家自己看吧。毕竟这里不是CSDN。我也没有那么多亲戚可以被问候。   回复  引用  查看    

#10楼 [楼主] 2007-03-31 13:18 亚历山大同志      

@Clark Zheng
那么你认为是为了什么?   回复  引用  查看    

#11楼 [楼主] 2007-03-31 13:19 亚历山大同志      

@eBay
那么你认为一个页面应该有几个Connection,还是每个Session一个还是每个Application一个?   回复  引用  查看    

#12楼 [楼主] 2007-03-31 13:26 亚历山大同志      

@eBay
你还是在避重就轻的引述我的话,我的观点很清晰,不用重复了,如果经典理论不能被颠覆,那么经典力学也都是在现在都无懈可击的。而且,求求你用事实,用例子,用你的清晰的观点来驳倒我,而不是笑笑说“年轻人,你不对”。而且也不是我抛砖头原意   回复  引用  查看    

#13楼  2007-03-31 13:28 eBay      

对于你的问题,正确的回答是“需要的时候才有一个”。

你对架构的理解停留在什么地方呢?一个Entity一定就是对应DB的?一定要从数据库中获取?一定要通过ORMapping来转换?获取实体就一定要有一个数据连接?业务实体的全部内涵就是数据?

倒霉的多层架构。   回复  引用  查看    

#14楼 [楼主] 2007-03-31 13:42 亚历山大同志      

@eBay
不知道你怎么理解多层的,Entity是领域模型,是跨层的,在数据层需要有对应此Entity的数据操作的代码。不一定所有的Entity都对应数据库,但是一定有Entity时需要和数据库有关联的。俗话说以偏概全,就是你这样的,又一个Entity可以不和数据库打交道就所有的都不合数据库打交道了?笑话,可怜的Entity   回复  引用  查看    

#15楼  2007-03-31 13:42 vainnetwork [未注册用户]

我觉的,楼主的方法,是可以解决一些数据连接聚集的问题,当然什么方法都有不适应的时候,不然技术就停留了.看别人 BLOG.我觉的只能给建议,并不需要攻击.有用就学习,没用就提醒撒,   回复  引用    

#16楼 [楼主] 2007-03-31 13:50 亚历山大同志      

@vainnetwork
任何技术都有适用的领域,三层和MVC都不是万能膏药,不能处处都用,言必3层MVC,肯定就是走火入魔的表现了   回复  引用  查看    

#17楼  2007-03-31 14:03 双鱼座      

本文基于两个可笑的观点而提出:
1.每个Session一个线程。从楼主的上一篇文章中已经发现这个极其错误的提法。楼主需要再认真复习一下关于线程的基础知识以及IIS和ASP.NET运行时的线程模型。
2.堆栈链长度影响性能。我没有评测过每次调用增加千万分之一秒耗时是否会影响整个应用程序的性能。不过我看到过N多描述有关提升性能的技巧,没听说过缩短堆栈链长度这一招。即使有细微的影响,对于有利于开发效率这个收获是完全合算的。当然,调试的时候是一种特殊情况,不在此列。   回复  引用  查看    

#18楼 [楼主] 2007-03-31 14:32 亚历山大同志      

@双鱼座
既然你说到了IIS和ASP.NET运行时的线程模型,那么IIS5.0还是IIS6.0,ASP.NET1.0还是ASP.NET2.0?你能清楚地指出问题所在?还是需要我在这里再来讲解一下IIS和ASP.NET运行时的线程模型?

很简单一个例子,假如每个Session都是同一个Thread的话,很简单就能验证,在Page_Load的时候System.Threading.Thread.CurrentThread.Suspend();
再开个IE,看看能打开其他页面不,很容易就能验证了

第二点,调用栈过长只是我批评的一点,万分之一秒就是程序员要争取东西,虽然糟糕的美工做的满是大图片的页面就可以让你所有的优化付之东流,但是谁叫你不是美工呢。

  回复  引用  查看    

#19楼  2007-03-31 14:38 Dflying Chen      

分层主要是为了让代码容易读点并提高可伸缩性,如果没有这方面要求,自然没必要偏要3层什么的,总归具体问题具体分析了,呵呵   回复  引用  查看    

#20楼  2007-03-31 14:41 Dflying Chen      

数据库联接的问题,也应该由Data Layer封闭处理,与Presentation Layer是ASP.NET还是WinForm没有关系。当然这是理想化的了,呵呵。但不管怎么样,如果数据库联接出了问题,首先应该质疑的是Data Layer的实现,而不应该是N层架构的合理性。   回复  引用  查看    

#21楼 [楼主] 2007-03-31 14:43 亚历山大同志      

@Dflying Chen
one page one connection,只是我针对纯粹效率上的建议,如果架构了看情况是可以为架构让道的,还有分层的话既然没有完全的隔离,何来层的概念?很容易误导初学者   回复  引用  查看    

#22楼  2007-03-31 14:48 Dflying Chen      

@亚历山大同志
我觉得Page和Connection之间的距离太远了,一个是PL的,一个是DL的。PL就管显示数据和用户交互就行,DL也不用担心调用它的PL是什么东西。

要是在设计Page的时候就考虑Connection,那也没有什么分层的思想在里面了。

个人意见,仅供参考   回复  引用  查看    

#23楼 [楼主] 2007-03-31 14:52 亚历山大同志      

@Dflying Chen
我主要就是要批驳分层这种垂直划分层次的观念︿_︿   回复  引用  查看    

#24楼  2007-03-31 14:55 volnet(可以叫我大V)      

楼上楼上楼上不要打假哦~~~~``
和气为贵

偶就打算用一个博客系统来体现三层,可能是最早(毕业设计)选题选不太好,这个题目不太适合表现业务逻辑层,倒时候就得当抛砖引玉了。

没有太多的业务逻辑,但我们同样能够让膜来定义接口,接口是最需要稳定下来的,内部的实现可以交给程序员去做了.........

@eBay
多的话不说,大家自己看吧。毕竟这里不是CSDN。我也没有那么多亲戚可以被问候。
这句话什么意思????
  回复  引用  查看    

#25楼  2007-03-31 14:56 Michael.Yang      

@eBay

你对架构的理解停留在什么地方呢?一个Entity一定就是对应DB的?一定要从数据库中获取?一定要通过ORMapping来转换?获取实体就一定要有一个数据连接?业务实体的全部内涵就是数据?

这句话我很赞同 :)   回复  引用  查看    

#26楼  2007-03-31 15:04 双鱼座      

@亚??同志:
看来你对我的建议很有几分不服。没有关系,你可以继续维持你的自信。
你需要什么样的测试?你看看下面的测试能否推翻你“一个session对应一个线程”的结论?
很简单。我在一个页面中开发N个iframe,每个iframe中显示同一个页面,页面上仅仅显示当前线程的ID。在一个单CPU的机器上,总是同一个ID,而在一个多CPU的机器上,则显示多个ID,没有任何规律可言。我就不明白了。如果有1500个session就一定得开1500个线程?再好的服务器恐怕都得被线程切换拖死吧。
  回复  引用  查看    

#27楼  2007-03-31 15:11 kiler      

楼主还要好好理解一下什么是分层,分层的意义是什么。

“从历史沿革上来说,MVC和分层设计是没有交集的从历史沿革上来说,MVC和分层设计是没有交集的”
恰恰相反,我认为MVC和分层设计完全有机会一起使用,在MVC模式中的M其实就相当于三层架构中的业务层和数据层,而VC则相当于表现层,所以MVC和分层设计是没有冲突的,完全可以一起使用

“不过面临的问题也很简单,长长的调用栈,效率的降低,和扩展的复杂”
能降低多少效率,没有必要关注。

“很多时候,网站的逻辑都是相当的简单的,读表,填充Grid完毕。这样子的逻辑都要在业务逻辑里跑一次,其实协议个方法出来里面却只有一行,或者几行代码,其实就是转发一下数据层的结果。”
如果你那么喜欢把代码写在一块,建议用asp,php,jsp,别用asp.net,它不适合你,代码分层写是为了使代码更清晰更好维护。


“。这样子的逻辑都要在业务逻辑里跑一次,其实协议个方法出来里面却只有一行,或者几行代码,其实就是转发一下数据层的结果。老实说如果是做个新闻发布的系统的话,业务逻辑层几乎通篇都是转发的代码,结果当修改了数据库的时候还要多改几个地方,简直是没事找事啊。”
由于你的分层的概念不是很清晰,很多与业务相关的东西你都写到数据层了,所以觉得业务无事可做,我就拿你的新闻发布的系统做一个说明吧,比如说发布一条新闻的动作吧,

假设我们要求是发布一条新闻就写一条日志,那么一个好的写法数据层要求提供把新闻和日志写入数据库的功能,业务层则是组合数据层新闻和日志写入操作,并保证这两个操作是一个事物。而一个烂的写法就是把这两个操作全写在数据层的一个方法里面,业务层就是简单的调用就完事(你说的写存储过程的方法也是这样的)。用一个很差劲的做法来论证分层结构的不合理实在是很无聊。

“一种是多层的,每个业务对象都有自己的数据连接”
鬼扯,业务对象只关心业务操作,数据连接是数据层管理的,业务对数据的操作完全通过调用数据层对象来实现的,业务对象根本不需要管理数据连接。

“所以我比较倾向于每个页面放一个Connection,在初始化页面的时候打开,在执行页面结束的时候关闭,”

要是这个页面不进行数据库的操作呢?打开了不是浪费。
比较合理的做法是在每一个request放置一个可以打开数据库连接的对象,例如Nhibernate的session,在需要操作数据的时候才打开数据库连接,在页面关闭的时候确保已经打开的连接关闭就可以了。

希望楼主能静下心来,好好理解一下这两个架构再来发表见解。

  回复  引用  查看    

#28楼 [楼主] 2007-03-31 15:17 亚历山大同志      

@Michael.Yang
之前的Reply对@ebay说过:
[不一定所有的Entity都对应数据库,但是一定有Entity时需要和数据库有关联的。俗话说以偏概全,就是你这样的,又一个Entity可以不和数据库打交道就所有的都不合数据库打交道了?]

关于你俩说的实体,一般意义上的定义是:
业务实体(business entity)是代表业务角色执行业务用例时所处理或使用的“事物”。一个业务实体经常代表某个对多个业务用例或用例实例有价值的事物,因此,业务实体对象的生存期相当长。一般而言,一个好的业务实体不包含关于其使用主体和使用方法的信息。

通常,业务实体代表产品的文档或重要组成部分。有时候,业务实体也代表一些非实体的对象,如关于市场或客户的重要信息。例如,饭店中的业务实体有菜单和饮料;而在机场,机票和登机牌是重要的业务实体。

不知道你们从哪里看出来我说了这个的全部就是函数,应该是属性吧
  回复  引用  查看    

#29楼  2007-03-31 15:18 eBay      

@双鱼座
吵归吵,这个事情上其实你是错怪可爱地楼主了。
"一个Session对应一个线程"和"一个线程对应一个Session"还是不一样的。

@亚历山大同志
但是并不代表你的其他说法正确。   回复  引用  查看    

#30楼 [楼主] 2007-03-31 15:27 亚历山大同志      

@kiler
业务逻辑的概念是什么要做哪些事情?此为一:
第二:所谓层次的概念,就是让底层的操作透明化,如果不做完全的封装就没有必要提出层次的概念,我不认同所谓分层的做法并不是我就要把代码写在一堆,其三:一个页面一个Connection并不是说我要把Connection就放在页面上了,至于该怎么设计,具体问题具体分析。
其四:我所关心的上连接的数量,所谓的每个业务对象都有自己的连接的说法是指,它里面会打开数据连接操作数据(不是绝对,但是大多数的会)。
其五:不用打开数据库的页面我不用Connection就行了,没人会弱智到不用操作数据也去打开关闭一次

还有就是很多人把页面的生存周期搞忘记了,对于Web来说,当你看到页面的同时,你所写的Page里的代码都是执行完了,包括关闭数据库连接,很多人对并发的概念都是模糊的   回复  引用  查看    

#31楼 [楼主] 2007-03-31 15:31 亚历山大同志      

@eBay
我都说对了还用拍砖么,对于有些情况下我这片Post的观点是无效的,比如我公司所维护的系统,不过对于大多数初学者所犯的错误来说,如果一味的为了分层而分层是绝对无益的。
对于很多对架构很熟悉的人在不知不觉中都会有意的回避分层所带来的缺陷,分层不是万能的,绝对有缺陷,就和上次我炮轰MVC一样。   回复  引用  查看    

#32楼 [楼主] 2007-03-31 15:34 亚历山大同志      

说白了我不赞同分层架构并不是要阻止你写业务实体和业务对象,用专门的对象来处理业务逻辑是没错的,就连微软的WebCase上都说简单的Select就不要用业务逻辑“层”去包裹起来了。   回复  引用  查看    

#33楼  2007-03-31 15:47 kiler      

@亚历山大同志

你有些东西还是没搞清楚

"其四:我所关心的上连接的数量,所谓的每个业务对象都有自己的连接的说法是指,它里面会打开数据连接操作数据(不是绝对,但是大多数的会)。"

业务对象不关心连接,他只需要调用数据层对象来操作数据,至于数据连接,应该由数据层去获取,在web开发中比较好的做法是把数据库连接保存在当前的request里面,在每一次request里面所有的数据操作都会共用这一个连接,request请求结束的时候保证关闭连接。web开发最底层的东西就是request和response。从这个层面管理数据库连接是最好的。

"还有就是很多人把页面的生存周期搞忘记了,对于Web来说,当你看到页面的同时,你所写的Page里的代码都是执行完了,包括关闭数据库连接,很多人对并发的概念都是模糊的"

这个东西我估计楼上的各位都很清楚。




  回复  引用  查看    

#34楼  2007-03-31 15:48 双鱼座      

@亚历山大同志
炮轰MVC很光彩么?我倒认为很象是无知者无畏。在很多情况下,使用多层的选择依据并不是业务多么复杂,而是变化多么大,当然太简单的业务往往没什么变化,并不能就此将选择依据退化成业务是否简单。楼主的文章貌似明白,通篇都在宣扬一些没有根据的结论。也许你的应用场景用不上MVC或者多层,但并不能因此而吹毛求疵地炮轰还一点不谦虚地引以为荣。我就纳闷假如你用不上JavaEE的话你为啥没有连JavaEE一块儿轰呢?   回复  引用  查看    

#35楼  2007-03-31 15:50 kiler      

@亚历山大同志

微软的WebCase大部分是给初学者看的,只是简单的告诉大家怎么实现一个功能,不会去考虑什么架构之类的东西,没大多参考价值。老实说微软也没有提出过什么比较好的架构。

感觉你现在有些说法有点像想告诉我们“马车比汽车好”。   回复  引用  查看    

#36楼  2007-03-31 15:55 RicCC      

哎说什么呢,没看到什么价值,也不是什么交流
很多人不喜欢细心的听,只是迫切的想表达,这样不好   回复  引用  查看    

#37楼 [楼主] 2007-03-31 15:58 亚历山大同志      

@kiler
你所说的在begainrequest打开和end request的时候关闭,请问这个时候有几个Connection?不是XXConnection俄对象,而是数据库连接,我所说的是在一个页面的生存周期只使用一个数据库连接操作数据库,我想你应该能够明白

WebCase不好说,基本的理念都是相通的。
  回复  引用  查看    

#38楼 [楼主] 2007-03-31 16:00 亚历山大同志      

@双鱼座
用不上JavaEE自然不用轰,说点分层的坏话就踩到你尾巴啦?还是@RicCC的话中肯,看清楚了,想明白了,再表达不同意见。
包括仔细看回复。
  回复  引用  查看    

#39楼  2007-03-31 16:09 kiler      

@亚历山大同志

在begainrequest只是保存一个未打开的连接,数据库连接只有在使用的时候,end request的时候关闭,对于同一个request里面数据操作使用的是同一个数据库连接,一个页面的生存周期说白了就是服务器处理一个来自客户端的request。只要保证每个request使用一个数据库连接就可以保证在一个页面的生存周期只使用一个数据库连接操作数据库。   回复  引用  查看    

#40楼  2007-03-31 16:45 双鱼座      

@亚历山大同志
呵呵,我不仅看过你的文章、你后面的回复,我还读过你以往的一些文章。给我最大的感受是你的很多感觉是想当然的,所以你提出来的一些观点几乎让我无语而你还洋洋得意似的。RicCC帮你说话,他的话就中肯;我驳斥你,你就说我的话不中肯。世界上有这样的逻辑么?你还能说你谦虚么?
首先.MVC/N-Layer(有别于N-Tier)这些技术都不是为了性能,而是为了另外一些目的,这个Dflying已经告诉你了,但是其实你并没有接受。我分析,主要是因为这些优秀的设计不能满足你,所以你不能接受。连堆栈链太长这样不着边际的理由也让你找着了。前辈们教我们不要写一些太长的方法,必要时可以分拆成多个方法,说这样易于阅读,同时也易于复用。而你一定会说,这不利于性能。性能与可扩展性、可维护性、可伸缩性、可测试性本来就是存在一定矛盾的,必要时你可以根据需要进行权衡和取舍。如果你仅仅需要性能,而不需要可扩展性、可维护性、可伸缩性,当然是不需要MVC/多层的,这并不是MVC或者多层的错误。
第二,其实最大的问题是,你现在挑出来多层的毛病,其实并不存在。关于连接,你连线程模型都没有搞明白,然后来讨论页面对象的生命周期、连接的生存周期。你还说你明白,还想给我讲授一番。我一个简单的例子就告诉你了,线程与会话没有必然关系。同样一个会话,完全有可能对同一个页面或者同一个数据库连接进行操作并可能发生冲突。你的页面论还能站得住脚么?
第三.我一直不喜欢VB,通常尖刻地批评VB,很多人指责我无知无畏。我接受了(不过并不是欣然),因为对比园子里的众多高手,我对VB的了解的确很浅。所以,我后来不再对VB说三道四。你可以不用MVC,也可以不用多层,就如同我不用VB一样。所以你也完全可以学我一样不再对MVC或者多层说三道四。
最后,我的尾巴你随便踩,我不在意的。我在意的是:你的一些言论可能会让一些初学者迷惘。   回复  引用  查看    

#41楼  2007-03-31 16:52 drizzt [未注册用户]

该用多层的用多层,该用mvc的用mvc,哪那么多费话.

当初刚出来的时候谁分过层?谁用过mvc?不还是照样活着


加班没事,上来就看到吵!

还有你的网站的黑色太呛眼睛...看完累坏了   回复  引用    

#42楼  2007-03-31 16:58 eBay      

其实关键是这帖子在首页,要是不放首页我们也就不进来唧唧歪歪惹人心烦了。毕竟blog还是比较private的东西,愿意写什么,别人管不着。问题是现在发到首页的这类文章实在是太多了点。抱着学习的态度进来看文章,经常是看着看着吓出一身冷汗,这都哪儿跟哪儿啊? 这得害死多少人啊?还嫌中国IT发展太好了不是?

亚历山大同志的问题就在于不喜人言其非。自己说欢迎拍砖,别人拍了立马抓狂。自己说自己是红卫兵可以,别人说就翻脸。搞得最后自己没立场了。还是年轻啊。   回复  引用  查看    

#43楼  2007-03-31 17:01 Lucifer [未注册用户]

Connection是很宝贵的资源。我们应该在需要的时候打开,用完,立刻关闭。   回复  引用    

#44楼  2007-03-31 17:02 drizzt [未注册用户]

@Lucifer
9494
是要花钱D   回复  引用    

#45楼 [楼主] 2007-03-31 17:17 亚历山大同志      

@双鱼座
如果一片帖子没人砸砖就是真的浪费了,没有期望得到一片歌功颂德之声,所以这篇Post我还是很满意其效果的,虽然很多人持有不同意见,如果坚持中庸之道模棱两可的发一篇Post,写得滴水不漏,怕是引不来这么多人出来说话。
我不是教育人,所以初学者迷惘不迷惘,那是真要就人而论。
关于ASP.NET的线程模型,不管怎么说,两个Session不会跑到同一个线程里这是肯定的。那么何来冲突?

假如都能够滴水不漏那我就是在写教材了。你在调用栈的观点我不反对,但是扩展性,可维护,可伸缩,这些也不是只有多层就能提供的。

所谓分层只是一个概念,没有标准化的教材教你怎么才叫分层,什么才是业务逻辑。
所谓炮轰分层,也是希望能够更加完善我们的架构。

无知无畏不是坏事情,没有批判也就不一定看得那么清楚,看清楚后反思,才会有进步
如果你是为了捍卫经典理论,那么请找一本《3层结构红宝书》借我看。
如果是要讨论技术,很欢迎你继续砸砖
同时to说微软没有好架构的仁兄,petshop的架构,分层都是java阵营最早提出来的   回复  引用  查看    

#46楼 [楼主] 2007-03-31 17:26 亚历山大同志      

@eBay
看到你的Reply不禁回想起了江core......
就把alex1000和你攀了亲戚叶不用记恨到现在吧

现在对于架构没有谁就是权威,说,分层架构就该如此,然后定一个标准ISOXXXX。既然没有标准谁能说自己所理解的分层就一定是正确的?都是师傅教徒弟,一个传几个,到最后就成了无数流派了。
也没有人说MVC就该如此如此,MVP是微软定义的这个我说不好。

跟我观念有冲突的我才跑出来回复,近来表扬我一句写得好我貌似没有近来继续砸砖的必要,所以你还是继续近来砸砖吧,初学者在这个过程中才能学到更多的东西   回复  引用  查看    

#47楼  2007-03-31 17:43 OK [未注册用户]

系统设计的难点在于 如何平衡 开发效率和运行效率 而不是 你唧唧歪歪的 那些废话

HOHO 还自诩红卫兵 厉害 本愤青向你致敬   回复  引用    

#48楼  2007-03-31 17:45 e表      

connection的粒度是无法一概而论的,应按不同的应用场景而定. ( 纯.net写的web报表设计工具: http://ebiao.cnblogs.com/ )   回复  引用  查看    

#49楼  2007-03-31 17:53 try[匿名] [未注册用户]

站在 双鱼座一边。
其它的不多说。
技术文章,尤其会误导:初学者!!!!!!
  回复  引用    

#50楼  2007-03-31 18:20 雨恨云愁 [未注册用户]

假设你的一Session一连接
在请求的时候打开Connection
请求结束时关闭Connection
你这样的理由时
避免多次开关Connection 而把所有的操作放一次连接里面去做
假设这样能够提升时间为A的效率
而同时你也要想到
如果在这个Request的页面里如果有一个时间较长运算逻辑
这时你就要连续占用整个Request的时间
假设这等待复杂时间是B
我看最后你省下的时间A可能要比B小多了
也就是得不偿失
你可能就要哭咯   回复  引用    

#51楼  2007-03-31 18:39 yok. [未注册用户]

每个session只有一个线程?每个session用一个connection?严重怀疑楼主是教师或公务员,要是在外面干的话你不知死多少回了   回复  引用    

#52楼 [楼主] 2007-03-31 19:02 亚历山大同志      

@雨恨云愁
你就算另开个线程去处理B都还是要等到B处理完成在能在页面上显示你所Select的结果.   回复  引用  查看    

#53楼  2007-03-31 19:05 肯.索夫特      

本来还以为有什么新方法可以提高Web效率的,下次拜托请不要用这么吓人的题目。
一般进行Web开发的程序员都应该了解,对于数据库连接的使用要遵守打开连接->SQL操作->关闭连接 这样的方式。
每个Session或每个页面都有一个连接......
对不起,我是在看笑话吗???
BTW:楼主应该不是技术人员出生吧,或者说楼主以前是做WINFORM开发的吧!!   回复  引用  查看    

#54楼 [楼主] 2007-03-31 19:12 亚历山大同志      

@肯.索夫特
不想继续重复回答这些毫无营养的回复了,请看清楚再发

这个post我从首页拿下,回头新发的来挨个讨论这些问题   回复  引用  查看    

#55楼  2007-03-31 19:40 geniusleft [未注册用户]

@楼主:
1.关于IIS站点线程模型是:一次HttpRequest对应一个线程。就像双鱼举例得那样,一个页面可能包含多帧从而发起多个HttpRequest从而产生多个线程。
2.关于网站性能与实现的关系,对此CommunityServer结构是个好例子,其目标是设计为高性能地应对海量请求。
3.可能大家都已经偏移讨论的主题了,本讨论的主题是 讨论MVC或三层架构这样的手段和提高web效率这个目标之间的关系,我这样理解对不对?对此我的看法是:
a)如果是小站点程序(小站点定义为访问量较小的站点,比如同时10人左右的访问),为了提高单页响应在代码级别进行的优化,一方面投入较大但可能会被其他因素抵消从而收获较小,另一方面对小站点程序而言,性能是最重要的衡量目标么?只要不出偏差,服务器一般就足以应付。
b)楼主提出论题的出发点还是像www.asp.net这样的站点或者大型社区吧,但这样的站点那就反而一定要注意三层这类的架构了。楼主着眼于单页响应,但单页响应的最终目的是网站总体吞吐,这个观点楼主同不同意?过于优化就必然紧耦合,但是优化是有极限的,再怎么优化也不可能一台服务器响应所有请求,如何考虑一个站点部署有多台web前端服务器这样的情况呢?前端几十台web服务器后端几百台database服务器所有服务器可能分布在好几个机房,而且每增加新的服务器以分流请求都应当不影响到站点的运行,比如导致网站暂停服务或者某些请求或Session丢失等,无法想象没有良好的分层架构如何达到这样的设计要求。
4.感觉楼主缺乏大型站点的经验,从而提出观点的出发点稍显片面而且讨论的话题本身比较小但又把范围放大了,在割裂地讨论问题。另外楼主是典型的程序员思维,其实为了提高网站吞吐,花人月成本进行优化和新买一台服务器分流对运营者的影响是同等的,区别在于投资回报率。
5.因为楼主的观念和论据不够全面也不够深度,可能大家就因此有点流于辩论本身了。另外综观楼主的文章,楼主的话题总是很大着眼点又不能提供有力支撑,建议楼主就自己有工业实践有足够经验积累的领域向大家提出指导,或者就自己也在摸索的领域以比较谦虚地态度和大家探讨,不要态度那么居高临下也不要论点那么绝对化。

一点感想,说错勿怪。   回复  引用    

#56楼 [楼主] 2007-03-31 21:13 亚历山大同志      

@geniusleft
很中肯,接受你的部分建议.这个post的确有些思路不够清晰.
有两点:
在大型系统中通过WebFarm来扩容不会增加程序的复杂度,所以不需要非要分层,从维护角度MVC也是可以的选择,而且局部的封装业务逻辑也不是不可以的。
然后处于和公司的保密协议我不能透露公司项目的详细情况,电信级项目,超过18台服务器,之前微软的架构师留下来的分层架构让我们苦不堪言,我们局部的优化架构之后才有了好日子过。
PS,个人觉得多数据的分布式应用是需要分层的,因为这样子才能把多个服务器的处理透明化。   回复  引用  查看    

#57楼  2007-04-01 12:08 ColdDog      

楼主其实是用苦肉计,吸引大家的讨论~
楼主辛苦了...   回复  引用  查看    

#58楼  2007-04-02 10:02 henry      

“所以我比较倾向于每个页面放一个Connection,在初始化页面的时候打开,在执行页面结束的时候关闭,这个样子基本上就能达到效率的最优化了”
你认为最好的实现就存在一个严重的问题,当然前提是你了解数据库连接池的机制和使用了它(如果不用连接池那真是...)。
可能你还没有碰到连接池溢出,那恭喜你因为你的页面处理逻辑还不是很复杂和大量的迸发访问。
  回复  引用  查看    

#59楼  2007-04-03 13:12 臭石头      

看到讨论这么激烈,我也来凑热闹。

在园子里我常看的博客里面,“双鱼座”成熟而稳重,“亚历山大同志”具有无限的创意(尽管不是全对),你们都是我学习的对象。我看过许多你们的文章和评论,也学了不少东西^_^

这个post,先不管楼主对还是错,我首先就支持,年轻时的创意与激情非常宝贵。尽管楼主碰壁不少,但那无畏,我还是挺崇拜的。楼主说出了自己的话,说出了自己的想法,我觉得其他人,不该那么强烈的扼杀。

我是一个.Net初学者,并没有像楼上某一位大哥所说“被楼主误导”。
  回复  引用  查看    

#60楼  2007-04-04 23:33 Anders.Zhao      

个人看法,MVC是横向的,三层是纵向的,两者可以合到一起。   回复  引用  查看    

#61楼  2007-04-07 11:42 teana      


"亚历山大同志的问题就在于不喜人言其非。自己说欢迎拍砖,别人拍了立马抓狂。自己说自己是红卫兵可以,别人说就翻脸。搞得最后自己没立场了。还是年轻啊。"貌似有道理!   回复  引用  查看    

#62楼  2007-04-18 22:39 Anders.Zhao      

同意楼上。
另外,讨论不等于争论,这里好像成了争论。
觉得博主对三层架构和MVC的理解好像还不深,有时候太抓住不重要的细节不放(个人感觉,不要骂我)   回复  引用  查看    

#63楼  2007-06-01 22:13 孤剑      

终于看完了。不容易阿

三层架构 和 MVC 没有什么说的,只能多看看学习学习,具体问题具体分析,不同的人角度不同看法不同,需要多了解学习一下。

楼主的题目的确有点大,如果能再举一些例子支持自己的论点就更好了。
大家的辩论很不错,需要的就是气氛,不过需要大家注意一下气氛,有点火药味了。   回复  引用  查看    

#64楼  2007-06-03 14:05 pp [未注册用户]

这哥们真好玩,懂一点不懂一点.
光是这句话我就觉得这个人技术不怎么样,"同时1000人访问就会在短时间内造成10000次数据库连接开闭的操作".老兄.去复习一下数据库连接池
三层还是非三层各有优势,懂得甚么时候怎么用才是最重要的.   回复  引用    

#65楼  2007-06-03 14:22 pp [未注册用户]

干脆你不要用面向对象语言了.最差的程序员才只关心数据流向,不用分析业务对象.你肯定要否认,那就是说你要封装类了,你封装类的依据是甚么,那我封装层不就跟你封装类是一个道理吗?你要封装方法吧,你写到一个函数里面就不存在厚厚的调用栈了,可能你也不会那样做.内存操作是很耗时的操作吗.这个年头硬件发展这么快.还在乎你那点"厚厚"的调用栈?太可笑了   回复  引用    

#66楼  2007-07-05 17:41 simonw      

提个建议, 我实在很想好好看你的文章, 但你的skin实在是让人看的眼睛疼,只好复制下来看了.   回复  引用  查看    

#67楼  2007-07-16 15:58 koenemy      

CommunityServer结构是个好例子,其目标是设计为高性能地应对海量请求?
这个结构可能是最典型的把简单问题整复杂的例子。

长长的调用栈?
微软的架构师强调,提高缓存的命中。多长关系不太大,得看命中次数。

MVC,三层?
这两个东东都得有应用的场景。总是架构,模式的挂在嘴边。啥时候应用才是关键,一来就整哪就是瞎用

每个页面放一个Connection,在初始化页面的时候打开,在执行页面结束的时候关闭
这种说法简直太傻了,真的。ado.net是有连接池的。整明白在来说。

一个大型网站,活的连接有多少,可以去msdn找个贴子,哪上面说的狠清楚,一个过万人同时在线的网站,连接池里有5,6个活动的连接就够了。

你需要什么样的测试?你看看下面的测试能否推翻你“一个session对应一个线程”的结论?
哪个测试只是说明一个session对应一个线程。每个frame里的页都是一个session..



  回复  引用  查看    

#68楼  2007-09-15 10:36 卖糕的      

CommunityServer结构是个好例子,其目标是设计为高性能地应对海量请求?
这个结构可能是最典型的把简单问题整复杂的例子。

嗯,我都被这个cs搞死了,以后打死不搞这种玩意   回复  引用  查看    

#69楼  2008-06-05 11:45 赵俊      

系统是分层了,写的文章没有分层,都搞在一起,看的头疼。   回复  引用  查看