分布式中数据更新的问题(200分)

  • 主题发起人 主题发起人 xtss
  • 开始时间 开始时间
X

xtss

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何在分布式应用系统中处理数据,比如说,用户进行APPEND,UPDATE,DELETE等操作
是在客户端处理,还是在应用层处理,要举例说明,如何写代码?
小第一直在看李维的那本系统篇,但一直搞不懂,请高手赐教!E-Mail:zlxtss@sina.com.cn
 
当然是在应用层处理了.我没有代码可以举例但我肯定是在应用层.
 
我们的系统是写在客户端来实现的,写在CLIENTDATASET的SQL 属性中,实现虽然是实现了,但我
觉得这不是最好的方式,最好是应该写在应用层中。但写在应用层中也是有讲究的,必须好好
的规划接口的设计,事实上李维的书里已经给出了很好的思考方式。
 
是由中间层的TDatasetProvider调用其绑定的TDataset实现的更新,TClientDataset所完成
的只是将指定发给TDatasetProvider。

我在应用中的划分方法是:
1、客户端:(只做用户界面,不包含任何业务逻辑,要更新数据时,调用业务
逻辑对象的方法,而不是用TClientDataset的Post或ApplyUpdates);
2、业务逻辑对象(在服务器端,通过调用数据对象来存取数据,业务逻辑全写
在这里面,封装为一个个的方法,供客户端调用);
3、数据对象(服务器端,不包含业务逻辑,只向业务逻辑对象提供数据来源)。
这样分离后,业务逻辑对象和数据对象可以在一台服务器上,也可以分开来,数
据对象与数据库在一台服务器上(如果与数据库是同一平台的话),如果后面的数据库表
结构、业务逻辑发生变化时,只要接口没有发生变化,客户程序就不用更新,这就意味着可
以避开传统C/S结构程序的一大麻烦:更新客户端程序。

(http://www.delphibbs.com/delphibbs/dispq.asp?lid=1423995)
 
APPEND,UPDATE,DELETE都是在客户端处理,所作的更改都是保存在本地的
Dcomconnect的delta属性中,如果要把本地的更改结果更新到服务器,要用
applyupdates()这个函数。
 
我现在知道了在中间层里写,但是还不知道TDatasetProvider如何接收参数,而ClientDataSet
又是怎么传递参数?
 
传递参数?你指的是在SQL语句里的参数吗?只需要把TDatasetProvider的Options->
poAllowCommandText设为True就可以了,设置之后客户端TClientDataset就只需要像使用
TQuery的参数那样使用参数就行了。
 
Delphi其实有个误导,很多的数据都是在client处理,那样写出的程序其实不是真正的分布式
其他非Delphi的client是不能调用的服务层接口的
如果你想很灵活的方式就是在服务层定一个接口方法,client通过调用接口方法的方式进行数据更新
要想写好分布式的程序,建议好好学学 C++写分布式的思想,《COM原理》那本书就不是不错的东西

 
taninsh你不会用吧,^_^delphi的midas配合mts/com+绝对可以写出高效的分布多层
的系统,你要是非得在客户端
写大把代码,那绝对是假三层了,不是看什么C++写分布式,或者delphi写分布式,分布
多层有很多规范的,可从没听过什么c++规范,只有corba,j2ee等规范,不要乱教。
好好看看李维的书吧。。什么就两级提交
client.edit(APPEND,UPDATE,DELETE)//客户端
client.post//客户端一次提交还在客户端的内存中
cilent.applyupdate//客户端二次,提交中间层处理了(这里才是真正的对数据库的操作)
至于为什么非要两次,一个sql语句不久搞定了吗?
那就是在写两层的代码了,当然享受不到两级提交的好处了
 
To Sachow :在中间层定义方法的是时候,不是也要定义参数吗?请问这边的参数定义
具体根据什么来定义?比如说,客户要删除一条记录,那么在中间层定义一个
DelRecorder (var RecNo:OleVariant)方法,除了RecNo参数外还需要其他什么参数吗?
 
你忘了?
application server 的作用
減少數據傳輸,routetrip.....
client send command to application server ,then
application server update the data or database server update the data
application server transfer the result to the client application.
貴人多往事,肯定在想女孩了......哈哈
 
如果只是简单地删除当前记录,只需要调用TClientDataset的Delete方法就可以了,MIDAS
会维护数据库光标。但如果要删除记录的表建立了外键,且数据库不支持自动的级连删除,
那就最好是在应用服务器里定义一个方法,例:
function TTransDMServ.DeleteUser(const UserID: WideString): Integer;
begin
Result := 1;
try
//删除外键相关表中的对应UserID的记录
//删除主表中对应的UserID的记录
except
Result := 0; //遇到异常,返回失败
end;
end;
 
多谢各位指教!
 
后退
顶部