delphi 三层的一些问题
大家好:
请教一下,delphi做三层
服务器端:remote data module+ADOConnection+ADOQuery+DataSetProvider
客户端:DCOMConnection+ClientDataSe
想请教一下:这样做,
1.服务器端怎样查看有多少个客户端连接,在必要的时候,怎样踢掉个别客户端
2.有多个客户端连接的时候,修改同一记录的可能性,怎样解决啊?
[解决办法]
1.服务器端怎样查看有多少个客户端连接,在必要的时候,怎样踢掉个别客户端
re:我的三层不是remote data module做的,给你个思路,不一定对。在服务器建立一个SESSION列表,当用户登陆则记录,未找到SESSION的用户则不让他执行服务器的方式。
2.有多个客户端连接的时候,修改同一记录的可能性,怎样解决啊?
re:在三层更新中有三种更新模式,对于一般不太重要的数据以主键更新即可减少冲突,重要的数据以比对所有字段更新方式。当一个用户修改过后,另一用户自然无法提交上去。让他刷新后再修改即可。
[解决办法]
加一个辅助的socket通信,来管理登陆用户
[解决办法]
midas没这能力
[解决办法]
把这个功能作为一个普通功能:每个用户连接前先注册,所有的业务功能增加一个是否允许的判断
判断依据就是注册信息
[解决办法]
Q:1.服务器端怎样查看有多少个客户端连接,在必要的时候,怎样踢掉个别客户端
A:这个可以在你进行Login成功的时候,记录下当前用户,并且记录一个失效时间,比如说一个小时, 如果一个小时之前客户端未曾执行过任何Sql语句, 那就说明LogOut了.
至于踢掉客户,理论上可以实现. 比如,通过拒绝执行客户端发来的指令. 但也有一个盲点,就是肯定会建立连接的
Q:2.有多个客户端连接的时候,修改同一记录的可能性,怎样解决啊?
A:这个木有其它办法的噢.三层本身就存在这个问题.
当一个客户更改了, 而另一个客户要去更新的话,就先提示要刷新后才可以更改.
要不,就额外开一个Socket,在服务器上检测是否做修改,如果做了修改,就给所有用到了这当前修改表的客户端发送消息,告诉他们数据被它人修改.然后再做相应的动作. 不过. 这样做,会加重服务器的负担..
当然, 一般情况下,也都不会这么做的,除非是要求非常严格的程序..
一般就你提示数据被他人修改了,然后让刷新后再修改保存就可以了.
[解决办法]
在你的服务器可以加一个StringList类,当连接了服务器的客户端DCOM,就生成一个记录加载到StringList中,并给它个名称,当断开了,就剔除。这样就可以进行管理了。
代码大概这样写。
TDCOM = packed record _IP : string; _Handle : integer; end;PDCOM = ^TDCOM;var DCOMList : TStringList;//窗体Create时 DCOMList := TStringList.Create;//当连接后procedure AddList()var PD:PDCOM;begin try new(PD); PD^._IP := '客户端IP'; PD^._Handle := '客户端DCOM的Handle'; DCOMList.AddObject(IntToStr('客户端DCOM的Handle'),TObject(PD)); except end;end;//当断开后procedure DelList(_Handle:Integer)var i :Integer; PD:PDCOM;begin for i := 0 to DCOMList.Count - 1 do begin if (PDCOM(DCOMList.Objects[i]^)._Handle = _Handle)) then DCOMList.Delete(i); end;end;//可以把连接的客户端信息用ListBox(DCOMList中的信息)显示出来,需要关闭哪个,直接Close就可以。//同时操作ListBox控件以及DCOMList。大体思路就是这样。
[解决办法]