原来没问题,使用XE11版本后服务运行一段时间就出错:Out of memory,调试发现FDQuery查询或执行后内存就增长(变量和控件都Free的),有没有哥们碰到这个问题,使用FastMM内存检测没有检测出来
----------------------------------------------
-
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后没有释放内存
----------------------------------------------
-