首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi COM+ 狀態維護:解決 AutoComplete 導致的對象釋放問題

     編輯:Delphi

問題背景

開發多數據庫切換的 COM+ 組件,需在運行時根據用戶身份動態連接不同數據庫。組件提供 ConnectTo(DBName) 方法設置目標庫,但調用後數據庫連接失敗,且後續調用報錯。

根因分析

  1. SetComplete 過早釋放:ConnectTo 中調用 SetComplete,導致 COM+ 認為任務完成,銷毀對象實例。下次調用時創建新實例,DBName 變回空值。
  2. AutoComplete 屬性干擾:即使改用 EnableCommit,TmtsDataModule.AutoComplete 默認為 True,且在 OnActivate 時被重置為 True,導致首次數據操作後仍自動釋放。

解決方案

procedure TmtsDBConn.ConnectTo(sDBName: string);
begin
  try
    DBName := sDBName;
    EnableCommit;  // 不結束實例
  except
    SetAbort;
  end;
end;

procedure TmtsDBConn.OnActivate;
begin
  AutoComplete := False; // 關鍵:防止自動釋放
end;

procedure TmtsDBConn.ReleaseInstance;
begin
  SetComplete; // 顯式釋放方法,客戶端調用完畢後調用
end;

客戶端調用模式

DcomConnection1.Connected := True;
DcomConnection1.AppServer.ConnectTo('DB2');
ClientDataset1.Active := True;
// ... 多次操作 ...
DcomConnection1.AppServer.ReleaseInstance; // 顯式釋放
DcomConnection1.Connected := False;

核心結論

  • COM+ 默認無狀態,需人工干預生命週期。
  • 在 OnActivate 中強制 AutoComplete := False。
  • 提供顯式釋放方法,避免資源洩漏。
  • 狀態數據存放在組件私有字段,生命週期與實例綁定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved