DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: hcwong1993
今日帖子: 37
在线用户: 19
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2023/7/28 14:06:14
标题:
XE11的FireDAC内存泄露Out of memory 浏览:748
加入我的收藏
楼主: 原来没问题,使用XE11版本后服务运行一段时间就出错:Out of memory,调试发现FDQuery查询或执行后内存就增长(变量和控件都Free的),有没有哥们碰到这个问题,使用FastMM内存检测没有检测出来
----------------------------------------------
-
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2023/7/28 14:24:52
1楼: 代码帖出来看看, 可能是引用的问题.
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2023/7/28 16:54:54
2楼: function TDM.SqlOpen(var aResult: string; aQry: TFDQuery;
  aSql: string; aSqlConn: TFDConnection): Boolean;
var
  mSqlConn: TFDConnection;
begin
  Result:= False;
  mSqlConn:= aSqlConn;
  if not Assigned(mSqlConn) then mSqlConn:= FDConnection;
  if not SqlCheckConn(aResult,mSqlConn) then Exit;
  FDBLocker.Enter;
  try
    Log('[SqlOpen]:'+(aSql),GDMIsSqlLog);
    try
      aQry.FetchOptions.Mode:= fmAll;
      aQry.Connection := mSqlConn;
      aQry.Open(aSql);  //hstmt
      Result := True;
    except
      on e:Exception do
      begin
        aResult := GetErroMessage(e.Message);
        Log('[SqlOpen]'+aResult+sLineBreak+'[SQL]:'+aSql,True);
      end;
    end;
  finally
    //if FUsePool then SqlDisconn; //归还连接
    FDBLocker.Leave;
  end;
end;

function TDM.SqlExists(aSql: string; var aErro: string; aSqlConn: TFDConnection): Boolean;
var
  qry: TFDQuery;
begin
  Result := False;
  qry:= TFDQuery.Create(nil);
  try
    qry.CachedUpdates:= False;
    //qry.FetchOptions.Unidirectional:= True;
    //qry.FetchOptions.Mode := fmOnDemand;
    if SqlOpen(aErro, qry, aSql, aSqlConn) then
    begin
      Result := (qry.RecordCount>0);
    end;
  finally
    if qry.Active then
    begin
      qry.Disconnect(True);
      qry.Close;
    end;
    FreeAndNil(qry);
    if FUsePool then SqlDisconn; //归还连接
  end;
end;

SqlExists('select 1 from tb_order',sResult);

跟踪发现:Prepare 和 Open  都增长内存(这个查出数据增长内存算正常),但是close和free后没有释放内存
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2023/7/30 12:53:21
3楼: 如果是
TFDQuery 的问题
随便弄个测试程序跑一下就跑出来了。

有这功夫早就测完了
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行132.8125毫秒 RSS