可以说是关于多线程的,高手们,朝这看!(100分)

M

mzrl

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi5开发的Web中,加了一个中间层,该层只负责连接数据库,运用了缓冲池方式(基本上是Delphi5的例程pooler),正常情况下如果连接同一数据库的线程已建立而且没被使用,应该是连到该线程而不是建立新的线程,但是现在有极个别的机器会不断的创建新的线程,直至机器的资源耗尽,不知哪位大侠可以指点迷津?
 
应该与机器无关,还是你的代码问题,请贴出来看看。
 
谢谢你的关注,其实是利用了Delphi5的例程Pooler,将DM中放入TADOConnection,TADOQuery,TDataSetProvider,Web(CGI)程序通过DCOM连接中间层。在例程中加入了判断,如果连接数据库的信息改变了就重新创建,否则看已存在的是否在使用,在用就重建,没在使用就连接到该线程。
function TPoolManager.LockRDM(DBSetCode:String;CanCreate:Boolean): IPooledRDM;
var
i: Integer;
begin
Result := nil;
if WaitForSingleObject(FSemaphore, Timeout) = WAIT_FAILED then
raise Exception.Create('Server too busy');
for i := 0 to FRDMList.Count - 1do
begin
if GetLock(i,DBSetCode) then
begin
Result := PRDM(FRDMList).Intf;
Exit;
end;
end;
if CanCreate then
for i := 0 to FRDMList.Count - 1do
begin
if GetLock(i,DBSetCode) then
begin
Result := PRDM(FRDMList).Intf;
Exit;
end;
end;
if (CanCreate) and (FRDMList.Count < MaxCount) then
begin
Result := CreateNewInstance;
Result.ConnectADOC(DBSetCode);
end;
if Result = nil then
raise Exception.Create('Unable to lock RDM');
end;

procedure TPoolManager.UnlockRDM(var Value: IPooledRDM);
var
i: Integer;
begin
for i := 0 to FRDMList.Count - 1do
begin
if Value = PRDM(FRDMList).Intf then
begin
ReleaseLock(i, Value);
break;
end;
end;
end;

 
to shgproduct,你同意chnplzh的说法?你的意思还是程序有不严密的地方是吗?我是专门为这个问题才申请大富翁帐号的^-^,所以恳请大家帮忙。
 
顶部