三层结构,两个问题,在线等救 ( 积分: 50 )

  • 主题发起人 主题发起人 138075
  • 开始时间 开始时间
1

138075

Unregistered / Unconfirmed
GUEST, unregistred user!
三层结构,客户端和服务器端用TCliectSocket和TServerSocket进行通讯

1.用通讯方式来向服务器取数据
客户端:ClientSocket1.SendText('GetUserInfo+','+'张三') //向服务器取张三的资料
服务器:ServerSocket.ClientRead收到请求后,从数据库中取张三的资料,Send回来给客户端

2.用远程模块方法
客户端: frmDM.SocetConn.AppServer.Get_UeseInfo('张三');
服务器: 远程模块里的Get_UserInfo方法里从数据库中取张三的资料,返回给客户端

3.ClientDateSet.CommandText方法,直接在客户端用SQL,Open服务器数据库取张三的资料

这三种方法都可以从远程服务器的数据库中取资料

我想问的是:我该用哪种方法?

第3种方法,服务器是比较省事,不用写代码都可以,要有修改也不改到它,但是运行效率是否最低?
第2种方法,服务器端要写一大堆方法,要有修改服务器也要停下来开刀。但是每个客户端连接它都会生成一个新的线程连接,是否比较有效率和稳定?
第1种方法,要搞封包,比较罗嗦,而且如果用非阻塞模式控制比较麻烦。如果对返回的数据比较多的话,很难处理。但是客户端没数据模块,比较瘦小。

还有个问题是:如果用第1种情况,服务器的ServerSocket收到请求后,运行一个AdoQuery去取数据,但是如果同时这个时候又来另外一个客户的同样请求,那么怎么处理?这个AdoQuery已经是在open中的了,怎么解决这种冲突?不象第2种方法,一个客户一个模块,互不干扰。
 
三层结构,客户端和服务器端用TCliectSocket和TServerSocket进行通讯

1.用通讯方式来向服务器取数据
客户端:ClientSocket1.SendText('GetUserInfo+','+'张三') //向服务器取张三的资料
服务器:ServerSocket.ClientRead收到请求后,从数据库中取张三的资料,Send回来给客户端

2.用远程模块方法
客户端: frmDM.SocetConn.AppServer.Get_UeseInfo('张三');
服务器: 远程模块里的Get_UserInfo方法里从数据库中取张三的资料,返回给客户端

3.ClientDateSet.CommandText方法,直接在客户端用SQL,Open服务器数据库取张三的资料

这三种方法都可以从远程服务器的数据库中取资料

我想问的是:我该用哪种方法?

第3种方法,服务器是比较省事,不用写代码都可以,要有修改也不改到它,但是运行效率是否最低?
第2种方法,服务器端要写一大堆方法,要有修改服务器也要停下来开刀。但是每个客户端连接它都会生成一个新的线程连接,是否比较有效率和稳定?
第1种方法,要搞封包,比较罗嗦,而且如果用非阻塞模式控制比较麻烦。如果对返回的数据比较多的话,很难处理。但是客户端没数据模块,比较瘦小。

还有个问题是:如果用第1种情况,服务器的ServerSocket收到请求后,运行一个AdoQuery去取数据,但是如果同时这个时候又来另外一个客户的同样请求,那么怎么处理?这个AdoQuery已经是在open中的了,怎么解决这种冲突?不象第2种方法,一个客户一个模块,互不干扰。
 
用Midas吧。
 
用第一种方法处理好了,效率最高
 
用第二种方法符合OOP原则
 
用第二种方法符合OOP原则
 
既然都用第2种,那么, ClientDateSet用来干什么?
如果读大量的数据到本地的Grid里,不是一样要用到ClientDateSet来open?
 
同意第二种方法,楼主都说的这么好了,想来也是个高手啊!
 
如果你要的数据都在数据库里,而且直接用SQL就可以搞定,那么用第三种。
如果你要的数据要经常一大堆计算,那么就用第二个种。

一套三层系统往往第2,3两种方法同时使用。这种开发效率非常高!!!
 
后退
顶部