一般三层中是使用有状态对像还是无状态对像?(300分)

远帆

Unregistered / Unconfirmed
GUEST, unregistred user!
一般三层中是使用有状态对像还是无状态对像?
有状态对像不需要手工编程,但是我感觉总是保持链接和数据集资源浪费比较多。
但是无状态对像需要经常执行SQL。不知哪种方式效率更高一点?
如果在一个无状态对像在向客户提供了数笔记录之后,源数据发生了改变(比如原先已
提供的某条记录已被删除),是否会导致冲突(比如出现重复记录)?
在三层中是否可以建立一个由remote数据模块各个实例之间共享的数据集,在需要提供
某笔数据时由remote数据模块在数据集中自已取用?
thanks.
 
无状态对象,如果事务比较密集,如超市事务,就可以采用。
有状态对象,可以肯定不会出现冲突,前提是我们自己要控制好事务及时提交。
 
李维书上说的是一般建议用无状态对象
如果在一个无状态对像在向客户提供了数笔记录之后,源数据发生了改变(比如原先已
提供的某条记录已被删除),是否会导致冲突(比如出现重复记录)?
这样的情况有状态对象也无法避免。
 
学习!俺不明白如果用三层结构datamodule上的数据集不是太多了吗?
如果不用一一对应query的话!自己写更新语句岂不是写得烦死啦?
 
To Tassadar:
我感觉有状态对像在这种情况下没有什么问题啊,只是数据不一致,等到更新的时候就会发
现这个问题。
而如果是一个无状态对像,那么很有可能(应该是与分页的算法相关的?)发出重复的记录?像这样的情况如何解决?
to vmao:
我不懂你的意思?
 
选择有状态对象或无状态对象取决于最大同时连接数。无状态对象可以支持更多的并发用户,但是编程稍微复杂一点。
对象数量多的话,无状态对象比有状态对象更加节省计算机资源。而对象数量取决于并发用户数量。
 
嗯,我也是这么想。你平常是如何做的呢?能否共享一下经验?
 
to vmao:
三层结构肯定不是在一个Datamodule上面放无数个数据集了,
应该是根据模块不同设计不同的Datamodule,一个Datamodule只处理
单独的事务,跟c/s不一样。
to 远帆:
微软强烈推荐使用无状态对象是有他的道理的,
无状态对象在中间层的存在时间是很短的,做完了事情就马上释放
而有状态对象不一样,占有资源比无状态多,而且效率也不比无状态的高。
 
嗯,我就是想每一个数据模块的实例要是打开几个表(我想一般三层最好以方法调用的方式
来处理业务逻辑,但是很多时候数据集的调用恐怕不能必免),然后每一个客户都保持链接
不释放,服务端内存占用将是惊人的。
但是我不是很清楚无状态对像怎么编写。特别是会不会出现错误。
 
借贵地问个问题:
李维书上说的是用无状态对象浏览数据,当继续浏览下一批数据时,将当前一批数据中的
最后一笔数据传到中间层,由中间层定位。说这样可以减少网络上的数据传输量。但是在
中间层用ClientDateSet定位数据也要传送大量的数据呀?
用李维在Delphi5系统篇中的方法可以减少网络上的数据传输量吗?
 
To 滑翔机:
  这个问题我是这样理解的,不知对不对
  在中间层做分页的工作比较简单,与具体的数据库无关,但是不能减小DBMS与APPSer之
间的网络流量,不过DBMS与AppSer之间应该是紧密偶合的局域网,AppSer与Cli之间可能是
低速网络联接,这种情况下中间层分页应该还是有优势的。
  我看到好多人用存贮过程在DBMS上分页,我想这才真正的能够减小网络流量,不过这种
方式应该是更复杂了。而且与DBMS关系密切。
 
使用对象缓冲时必须使用无状态对象,
因为你不能保证上一次为你服务的对象这一次还能为你服务,
没有对象缓冲时,可以保留状态
 
to Tassadar:
总算有人回答我的问题了!忙我解释一下!
我现在用两层结构!也不用datamodule!一般的主表/明细表我都会在窗体上放query
一个data_master、一个date_detail然后用tupdatesql进行缓存更新!用得很爽!
最近我在看李维的三层结构的书,问题来了!
他老是在中间层放一个datamodule!然后放query、datasetprovider输出接口!然后在
客户端用clientdataset调用输出的接口!当然这样我也能看懂!---我就在想我现在做的
程序里有太多的dataset了!如果每一个都在中间层放datasetprovider对应的话我的中间
层datamodule也放不下啊!而且这样编程不是很麻烦吗?---还有听说中间层可以封装业务
逻辑!这样如果有修改的话只要修改中间层就可以了、不需要分发客户端!我就更不理解了
!既然数据集都被我绑定了!又怎么能做到中间层改变了不重写客户端?
还有听说有一种nb的做法!中间层只放几个控件!取数据的时候传到客户端后自己写程序
控制insert、update、delete!居然还不用dbedit、dbgrid控件、用啥stringgrid!
我都不知道这到底是历史进步还是退步?这样写程序不要被累死啊?
 
我的习惯是,全部用无状态对象.Remote DataModule上不用一个DataSetProvider,全部在接口里添加方法实现功能.发布的时候连midas.dll都不要.呵呵,比较怪异的习惯.
 
也不是这样了,DataSetProvider可以传递SQL命令,
这样即使服务器只有一个DataSet,
也可以进行任何查询,
客户端可以利用功能强大的ClientDataSet来进行操作,
只会更方便,
如果像你说的那种,自己控制数据存取和更新的办法,
只能叫做sb,还不如用Socket来做呢
 
To LiChaoHui:
  呵呵~是啊,无状态对像应该在容错和负载平衡上也更有优势。不过,具体该如何做
呢?要是嫌分不够,还是可以再加的。
To vmao:
  我现在一般都是做两层,不过我在做两层时也是用datamodule的啊,而且我把常用的
逻辑做成函数调用的方式,我觉得这样的方式程序比较清楚。
  你说的那种nb的做法我想应该没有什么意义。我觉得可能是在中间层做好数据更新的
函数在客户端调用吧?
 
to vmao:
中间层不是只有一个DataModule,是很多个,比如你有一个模块是做订单的,
其中涉及了几个表,那么中间层就有一个dataModule, 里面就几个表,几个Provider。
中间层也不是只有一个dll, 是很多个分开的dll, 根据客户端的调用,不断被创建
和释放。
三层技术跟c/s有很多区别,设计的思想不能够停留在c/s的经验里面。
具体应用没什么固定模式,根据自己的设计做就是了,我的用法跟李维的不一样。
我的只有一个对象,客户端用的还是DataAware控件(这么多好控件怎么能不用呢)
 
LeeChange的方法我很欣赏,不过如果需要返回数据集的时候(总会存在这样的情况吧?)
自已用接口来做是不是得不偿失啊?我觉得那种情况还是用dataprovide比较好。
看书上的三层和别人的例子,好多全部是用dataprovide来做,我觉得那样比较的无聊,完
全是两层的做法。

To LiChaoHui:
我觉得不要迫不得以不应该从客户向中间层传SQL,那样把数据的封装破坏了。
 
呵呵,"自己控制数据存取和更新的办法"也不一定都是sb,比如说我,虽然傻了点,但还不至于是sb.
用DataSetProvider来访问数据不利于建立面向对象的Object,而是会把对数据的访问仍然牢牢的捆在关系型的表一级上.我觉的这一点,有位大侠的几本书也算做了点贡献,画图的时候画的全是Object,代码还全部都是访问DataSetProvider.呵呵.
还有,做ASP Object和ActiveX时,好象就更不应该使用DataSetProvider了.
 
哈哈,是不是说李大侠啊。他的书贼贵,我看也不是很怎么样。
不过我开始了解三层的时候看的是他的ado/mts/com+的那本书,那时候还完全不懂com呢,
他上来就讲用接口传递recordset,当时那个晕啊:)
 
顶部