1

使用德尔福 2006;我的目标是检查 TSQLConnection 实例是否空闲。因此,每次看到活动时,我都会将日期时间“m_dLastActivity”设置为“现在”。

由于 TSQLMonitor 在其跟踪处理中存在缺陷并导致内存问题(请参阅http://qc.embarcadero.com/wc/qcmain.aspx?d=89216),我尝试使用 SetTraceCallbackEvent 注册我自己的跟踪回调:

procedure TConnectionGuard.SetSQLConnection(const Value: TSQLConnection);
begin
   ...    
   if Assigned ( Value )
   and not ( csDesigning in ComponentState ) then begin
      ...
      m_SQLConnection.SetTraceCallbackEvent(U_ConnectionGuard.OnTraceCallBack, integer(self));
      ...
   end;
end;

回调只是将数据返回给注册它的 TConnectionGuard 对象:

function OnTraceCallBack( CallType: TRACECat; CBInfo: Pointer): CBRType; stdcall;
var Desc: pSQLTraceDesc;
begin
   Desc := pSQLTraceDesc(CBInfo);
   Result := TConnectionGuard(Desc.ClientData).OnTraceCallBack(CallType, CBInfo);
end;

事件本身:

function TConnectionGuard.OnTraceCallBack(CallType: TRACECat; Desc: pSQLTraceDesc): CBRType;
begin
   m_dLastActivity := now;
   Result := cbrUSEDEF;
end;

到目前为止,一切都很好,它有效。但是我很不舒服,因为我不知道我必须将什么作为 CBRType 结果(在 DBCommonTypes.pas 中定义)传回以产生最小的性能影响。事实上,我不知道我在回答什么,因为给定的参数 CallCAT 没有提供如何读取/处理它的提示。

有谁知道 cbrUSEDEF 是否适合至少进行跟踪?

编辑:我通过 TSQLMonitor 的源代码意识到,给出的 CBInfo 指针不是我注册的客户端信息,而是一个包含客户端信息的 psQLTraceDesc(在本例中是指向我的 Guard 的指针)。我已经根据这个事实调整了这些方法......

4

0 回答 0