cj、Another-eyes和斑竹请帮忙,遇到大问题啦!(100分)

  • 主题发起人 主题发起人 peterwang
  • 开始时间 开始时间
普通==MIDAS BUT NOT ACTIVE FORM
 
有一个情况忘了说:
我的应用服务程序死的时候,其他的客户端(不是用这个activeform的,用我原来
作好的“胖”客户程序)好象也“死了”,但其实里边只是Query的select语句
而已,然后把死掉的应用服务程序关掉,这边立马活过来!
这个情况是不是表明有死锁?
 
啊?不明白,BDE?DBMS?锁?
不过这个可能是如此:
APP SRV正在访问数据库,并把其锁死,然后客户死了
不过可湖也不该死呀?
 
能不能在客户这端提交前加个try什么的?关键是except怎么写?
 
斑竹在哪?快来救命!
 
斑竹在美国
为了您这个问题,CJ历尽苦难!
由于我的机器被人借去了(to eYes:这几天忙,没去,所以你的盘...sorry,现在还在上海吗?)
现在用的机器上没有 Delphi,我的 Delphi 4 build 537 CD 也借给人去刻了,手头的Build 533
都扔了(后悔呀),所以找了张 Borland C++ Builder 4 来做了实验,如下:
环境:
Server: HP Net Server LC II //没办法,没别的机器可用了,只好用这个了
OS: Windows NT 4.0 Chinese version with Service pack 4 and
Option Pack 4 installed//没办法SP5 还没收到,懒的D/L,MS会寄
DBMS: Microsoft SQL Server 6.5 linked with SQL Links shiped with
BDE 5.01{我现在单位用这个,懒的UPDATE到7,我SP也没装过,懒
的搞,反正不用BLOB}
Client: Windows 95 OSR/2 Chinese version with IE4.0 installed
//IE4没有把WINSOCK2一起带着:(?
DevTool:Borland C++ Builder 4 Build 14 4 Enterprise Edition
过程:
Server:
TRemoteModle
|Decent
TBCSRV
|Properties
DataBase1 TSession
Tyoe:TDatabase;
alias:sqlTest;session:Session ---->Name:Session1;AutoName:True
|
----------------------------------
| | | | |
V V V V V
Table1 Table2 Table3 Table4 Table5---->Every one use a TProvider named provider1-provider5 each with
default property exported;TDataSet provider is also tested
tb1 tb2 tb3 tb4 tb3 ---->I want to know if there're two ttable point to one table what
would happend,so table5.tablename = tb3,all table name is
not a real table on my server.
Client:
DBGrids->datasources->clientdatasets->connection controls->simpleobjectbroker->application-server
| | | | | |
------------------------ | | |
| V V V
you use also these with DCOM,CORBA, not nessary but CJ showed above
and OLEEnterprise strongly recommanded
are tested to use this especially
Socket has not when there are more
tested.the reason than one app-servers to
would be explained be used
below

Socket 连接需要 Winsock 2 我没有,所以...
ActiveForm and usual app are all test
one machine with three instance and two machine with six instance are all tested
调试都没问题!

关于服务器的启动和关闭:
App Server 像 COM 服务器(实际上就是),每次有客户请求,如果没有启动,那么启动之,
否则AddRef(1)增加引用计数;每次解除连接时,减少一个引用,如果引用为 0,那么则推出
服务器。注意Corba除非有DOA(我没写错,不是DAO)支持,否则无法自动启动应用程序服务
器。所以,只要你不手工启动应用程序服务器,而由客户启动之,那么,理论上讲,所有客
户释放连接后(没有客户连接时),应用程序服务器会自动关闭,然而,正如许多COM和DLL
调用一样,往往会有“死”在那里的连接。如果你手工启动应用程序服务器,其引用为1,那
么不可能由N个客户连接而有N+1个客户释放连接(1+N-(N+1)=0),所以,退出应用程序服
务器只有也用手工的了。不过,是否关闭应用程序服务器应该不重要吧?何况,不断打开/关
闭应用程序服务器会增加系统开销,降低性能。如果觉得不好看。把应用程序做成Trayicon的,
甚至是NT SERVICE(没做过)那么,是否关闭应用程序服务器应该不是问题,以下是DELPHI
HELP里关于这个问题的讨论:
When using sockets, there is no protection on the server against client systems
failing before they release a reference to interfaces on the application server.
While this results in less message traffic than when using DCOM (which sends
periodic keep-alive messages), this can result in an application server that
can release its resources because it is unaware that the client has gone away.
关于Session:
我十分抱歉,我没有注意你是5 Table--1 DataBase连接,我以为没用DataBase。如果如此,
不过,用了SESSION也不该死的更快呀?如此,只要TDATABASE有AUTONAME的SESSION即可。
实际上,MIDAS好象没有说一定要AUTONAME的SESSION,鉴于是多客户多线程请求,所以我还
才让你用的。每个TABLE一SESSION估计也不行的。
关于错误:
一般应用程序服务器在连接数据库、查询数据、更新数据、删除数据时,都有可能发生错误,
一般的情况下,应用程序服务器能够捕获到这些错误并会把它们错误信息反回给客户应用程
序。在应用程序中获得这些信息最简单的方法就是使用现成的错误处理窗体(BCB下的
ACTIVEFORM例子使用了这一技术,相信DELPHI的例子也有)。虽然没有仔细研究,不过总觉得
REMOTE DATA MODULE 和 COM/DCOM 脱不了关系(根据有关文档就算是使用OLE ENTERPRISE/
CORBA也会有一个中间层进行转换),至少实现方法有点像。我要说明的是,其错误处理估计
也使用了类似的技术,以捕获异常,所以,总觉得不该死:-)这只是自己的理解,可能有误。
然而,今天我没用CLIENT把APP-SRV真正拯死过!好象把APP SRV的TABLE的ACTIVE设置为TRUE
在D5 PREVIEW里会死,强行关闭SRV后,显示RPC调用错误。不过也是第一次就死!根据你所
有客户一起死,估计是SRV死了(是否由客户造成还不能确定,不过可能性不大),或者中间
层出了问题(SCKTSRVR.EXE死了吗?)。
关于分数:
分数只是好玩罢了,要那么多用处也不大,不过还是要的,那是游戏规则,我一般不用FPE:)
eYes:估计还需要多少时间追上会长?
希望对你有所帮助。也许错误不少,大家指正
 
to cj:
看了您的高见真是十*十*十分感动,谢谢!今天我继续调试,最短一次就死,
长的10次才死!
1、不知您修改并提交了否?我的除了修改并提交引起死掉外,其他操作都不死!
包括cancelupdates,clientdates.indexname:=.....等。
当一个客户修改并提交死后,其他的客户如果不执行修改提交也不死,一提交
才死,这时发现server不响应。
2、SCKTSRVR.EXE没死。
3、换成dcom如何作,直接把socket换成dcom控件就行了?其他要配什么?
to eyes:
加5个database不行,其他4个的别名看不见!
 
我用APPLYUPDATES递交了无数次
>当一个客户修改并提交死后,其他的客户如果不执行修改提交也不死,一提交 才
>死,这时发现server不响应。
正常,如果直接死才怪
换DCOM。放TDCOMCONNECTION,设置好属性(和SOCKET一样的),把CLIENTDATASET
的设置为这个DCOMCONNECTION,就可以,注意,客户和服务器都样安装DCOM。要使用
用户级访问,DCOMCNFG配置
 
to cj:
1、是否可能是我的table中记录数太多有关(5000以上)?
我要是不在dbgrid中修改,直接提交也不死的。
2、what is the mean:‘客户和服务器都要安装DCOM’,详细点好吗?明天我去
试试。难道不是“瘦”客户方式?如果用socket客户端才用拷一个dll文件哪,
如果客户端要装,可能用户不肯的。
 
--->加5个database不行,其他4个的别名看不见!
什么意思?
当然要指定每个database.databasename啦(不同的, 比如aaa,bbb,ccc,ddd,eee).
table.databasename就用这aaa,bbb,ccc,...呀.
 
to eyes:
明天再试试!
我还是希望用“瘦”客户机方式,因为用户的机器据说为了安全,为“二无”产品
无光驱、软驱,又不许共享服务器的光驱,难难难
 
>>按“修改”修改dbgrid中的数据,同时用clientdata的一个索引,修改完
>>然后提交修改,同时用clientdata的另一个索引。
^^^^^^^^^^^^^^^^^^^^^^^^^^
问题会不会出在这? 你提交完了, 但别人可能正在提交, 索引可能是无效的.
 
WIN95没有DCOM,如果是98/NT都有的。用DCOM主要是确定问题是否在
SOCKETCONNECTION上。这也许就是所谓的 TROUBLE SHOOTING吧
记录太多的话,设置返回数据量看看?
不能共享CD/FDD,可以共享HDD麻。
EYES:理论上,如果发现无效的索引,应该失败才对的。
如果和DB GRID有关,那么有个笨办法:
postclick
begin
try
clientdataset.disablecontrol;
clientdataset.applyupdates(-1);
finally
clientdataset.enablecontrols;
end;
end;

 
谢谢二位大虾相救,再次感谢!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
867
DelphiTeacher的专栏
D
后退
顶部