斑竹在美国
为了您这个问题,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:估计还需要多少时间追上会长?
希望对你有所帮助。也许错误不少,大家指正