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

  • 主题发起人 主题发起人 远帆
  • 开始时间 开始时间
to各位:
我也习惯全用无状态,不过我更喜欢将中间层作的细一点,就像李维<ADO/MTS/COM+>中的例子,将中间层分成数据模块层和事务协调层(或再加上其他层,例如Web Sevice层),虽然我感觉不到效率有多少的提高,但至少模块分的更细更清楚,有利改动和问题的查找。
至于客户端向中间层传SQL,我也一直搞不定到底好不好。如果是传数据,遇到最大的问题就是万一在开发快结束的时候客户突然提出后台某个表要改几个字段,这时候改动就可能相当大,这时的开发效率就会比传SQL慢很多。而传SQL又会大大降低数据的封装和安全,不知道各位是如何选择的?大家讨论讨论,有什么好的办法?
 
看书上的三层和别人的例子,好多全部是用dataprovide来做,我觉得那样比较的无聊,完
全是两层的做法。
我也觉得是这样!真是百思不得其解!这次跳槽后我要好好研究研究三层结构了!要不可能
会被淘汰了!
谢谢大家的回答!
有谁能发一些例子给我么?
在别人的地盘问问题不太好,另外开贴送分!
 
一般是无状态对象.
但事务就需要有状态对象
 
呵呵,开玩笑的说法,其实真正这么做的人,不管怎么说,都是比较nb的,
毕竟,不是人人都能做的,像VC的程序员和ASP的程序员都是经常这么干的,
他们也很容易写出高效的程序, 但是从复杂度和快捷性来看,
Borland提供的套件,给我们带来的很大的方便,前提是,我们必须按照
他的设计思路和模式来进行开发,就像学MFC的人,文档视图框架带来了方便,
但是,大多数情况下,不需要这种框架,反而束缚了人的思维
ClientDataSet能给我们带来更大的方便,能省去我们很多的代码,
如果不需要数据集也可以完成你的工作,或者说,你喜欢用键盘来写程序,
而不是用鼠标来写,你会拥有更大的自由度,当然这适合勤劳的人
 
破坏数据的封装也不一定就是坏事,譬如:
我通过传递SQL的方法,可以容易的访问很多基础的小树据量的表,
而我只需要放一个查询组件和一个数据集提供者,
服务器端非常简化,客户端也具有更大的灵活性,
避免了设计很多的接口,以及客户端对接口的调用,
程序的复杂度大大降低,当然更利于维护了,
如果你想限制能够执行的SQL语句或能够查询的表,可以在服务器端加以检查,
封装并不一定都是好事,需要权衡利弊,封装和通用是需要付出代价的,
封装是没有止境的,封装的目的是为了代码的结构化,代码的无关性,
隐藏实现的细节,实现统一的接口
 
>>在三层中是否可以建立一个由remote数据模块各个实例之间共享的数据集,在需要提供
>>某笔数据时由remote数据模块在数据集中自已取用?
这种想法是可以实现的,实现数据的内存缓冲,读取数据时将会获得更快的速度
可以建立一个全局的数据模块,来存放此类数据,
其他模块可以随时访问,当然如果是自由线程访问,则需要进行互斥和同步的控制
Demos/Midas/Pooler中实现了一个对象缓冲的例子,和无状态数据模块的调用方法
 
如果你的客户端数量很庞大(几十个,乃至上百个),
可以考虑使用对象缓冲和数据库连接池
对象缓冲的功能,COM+中有充足的支持,并且支持事务功能,实现无状态的服务端
>>如果在一个无状态对像在向客户提供了数笔记录之后,源数据发生了改变(比如原先已
>>提供的某条记录已被删除),是否会导致冲突(比如出现重复记录)?
两层中也有这样的现象,导致冲突是难以避免的,只能重新检索正确的数据
 
那如何捕获到这种错误呢?
 
如果数据非常庞大,比如有数百万条记录,几G的容量,这时在服务器端用一个table进行缓
冲是不是就变得不合适了?
 
这种错误一般在提交更新数据的时候才能发现,
当然,如果在进入编辑状态时,刷新数据也可以发现,
提交失败后,检查失败的情况,对数据进行修改,再次提交
如果数据量非常大,需要很大的内存作为后盾,在内存中进行过滤和查找
反而没有数据库中查找的速度快,因为数据库中往往有索引,
并且查找算法都是很成熟稳定的,内存数据集就不能比了
缓存少量的经常使用的数据是可取的
 
嗯,做了两年的cs了,到现在我还没有搞清是用SQL语句搜索快还是用locate搜索快。
记得以前看过说locate会自动加索引的。有时间了再试一试。
 
Delphi的New Items对话框中的Dialogs页
能够建立一个Reconcile Error Dialog的对象,就是专门用来处理
这种更新失败的,至于具体的方法,你可以看一下其源代码
 
嗯,这个我看过。thanks.
 
听课ing,都是些大佬啊。
 
如果数据量小,肯定是Locate快了,
一个在内存里面查,一个在磁盘上查,内存要快多了,
但是数据量很大时就不一定了
还和算法有关系
 
To LiChaoHui:可能难说哦,DBMS也会使用缓存的。
 
不过,大佬们,问个极简单的问题,如何判断窗体上的一个控件在哪个模块出现的。
比如:
EXE文件A调用DLL文件B,B中有窗体C,C上有按钮D,现在我要在程序中怎么才能知道按钮
D是出现在模块B中的并且知道模块B的名字?我要做联机帮助才有此一问。以前用过一种方法,不过人年纪大了,记忆力就不好,况且我一般没备份辕马的习惯。
 
用parent试一下?
 
to 楼主:
数据库也会缓冲的,但是一次访问数据库的开销和访问内存数据的开销可是差别很大的呀
 
parent肯定不行啊
 
后退
顶部