【问题标题】:About FDQuery with TIdTcpServer关于使用 TIdTcpServer 的 FDQuery
【发布时间】:2019-02-26 05:46:07
【问题描述】:

如何防止 TFDQuery 在使用 TIdTcpServer 运行的应用程序中导致过多的内存消耗?

我在运行时创建 TFDQuery,使用后我在 TIdTcpServer 的 OnExecute 事件中销毁它:

Query             := TFDQuery.Create(Cn);
Query.Connection  := Cn; 
Query.SQL.Text    := 'update table set column = 0 where ip = :ip';
Query.Params.ParamByName('ip').Value := ip;
Query.ExecSQL;
FreeAndNil(Query);

每个新连接都在 MSSQL 上执行选择/插入/更新,所以我总是创建/销毁对象,但内存仍在增加(我正在与在 TcpServer 上创建各种连接的客户端进行测试)

我已经测试过了,如果我从 OnExecute 应用程序内存中删除 TFDQuery,测试时总是可以的。

cn 是始终处于活动状态的 TFDConnection,在应用程序启动时创建并在应用程序关闭时销毁。

【问题讨论】:

  • 这意味着原始代码引发了一个你没有捕捉到的异常,绕过了对FreeAndNil(Query)的调用,通过添加try..finally块修复了这个问题
  • 我已回滚您的编辑。如果您找到了解决方案并想分享它,请在下方专为此目的设计的空间中发布答案。见Can I answer my own question?
  • 为什么每次都要经历创建/释放 FDQuery 的复杂过程?为什么不直接打电话给Cn.ExecSql()

标签: delphi indy firedac


【解决方案1】:

使用这种在运行时创建/销毁的方法解决了:

with TFDQuery.Create(nil) do
        begin
          try
            Connection := Cn;
            SQL.Text := 'update table set column = 0 where ip = :ip';
            Params.ParamByName('ip').Value := ip;
            ExecSQL;
          finally
            Free;
          end;
        end;

【讨论】:

    猜你喜欢
    • 2017-10-18
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多