Einzelnen Beitrag anzeigen

Benutzerbild von emsländer
emsländer

Registriert seit: 21. Aug 2004
Ort: Lengerich
658 Beiträge
 
RAD-Studio 2009 Ent
 
#1

Hat die MySQL oder die libmySQL.dll ein Memory Leak?

  Alt 29. Aug 2006, 07:29
Moin,

Ich bin hier schier am verzweifeln. Da ein Dienst, den ich gebastelt habe, mal den Server lahmgelegt hat, habe ich auf den Speicherverbrauch geschaut. Oups ... jeder Aufruf der Datenbank routine kostet 4-16k. Es reicht aus, einfach nur dir Funktion open_fdd und close_fdd aufzurufen. Hier der entsprechende Code:

Delphi-Quellcode:
function open_fdd : PMySQL;
var
  _myCon: PMySQL;

begin
  result := nil;
  try
    _myCon := mysql_init(nil);
    logdatei('Verbindungsdiscriptor initialisiert','mysql.log');
  except
    _islog := true;
    logdatei('Irgendein Problem ' + mysql_error(_myCon),'mysql.log');
    //beep;
  end;
  if _myCon = nil then begin
    logdatei('Nicht genug freier Speicher, um Verbindungsdeskriptor zu initialisieren','mysql.log');
    Exit;
  end;
  if mysql_real_connect(_myCon, cMySQLhost, cMySQLuser, cMySQLpass, cMySQLdb, cMySQLport, nil, 0) = nil
    then begin
    logdatei('Die Verbindung konnte nicht hergestellt werden. Ursache: ' + mysql_error(_myCon),'mysql.log');
    Exit;
  end;
  result := _mycon;
end;

function close_fdd(_myCon : PMySQL) : boolean;
 var _text : string;
begin
  try
    mysql_close(_myCon);
   logdatei('DB sauber geschlossen','mysql.log');
  except
    _islog := true;
    _text := mysql_error(_myCon);
    logdatei('Fehler beim Schliessen der DB: '+_text,'mysql.log');
  end;
  result := true;
end;
Die Funktion logdatei kann es nicht sein (ich hatte die schon einmal auskommentiert). Aber auch hier mal den Code anbei:

Delphi-Quellcode:
function Logdatei(Text: string; filename : string) : Integer;
var
  LogFile: TextFile;
  TDTempStr: string;
  errorlevel : Integer;
  sDayDir : string;
  sMonthdir : string;
  sYearDir : string;
    _sAppDir : string;

begin
  _sAppDir := ExtractFileDir(Application.ExeName);
  errorlevel := 0; // Keine Fehler
  sYearDir := _sAppDir+'\'+dateletters(inttostr(yearof(date)));
  sMonthDir := sYearDir+'\'+dateletters(inttostr(monthof(date)));
  sDayDir := sMonthDir+'\'+dateletters(inttostr(DayOfTheMonth(date)));
  if _islog then begin
    if not DirectoryExists(sYearDir) then CreateDir(sYearDir);
    if not DirectoryExists(sMonthDir) then CreateDir(sMonthDir);
    if not DirectoryExists(sDayDir) then CreateDir(sDayDir);

    if filename<>'startlog.logthen filename := sDayDir+'\'+filename else filename := _sAppDir+'\'+filename;

    try
      DateTimeToString(TDTempStr, 'dd.mm.yyyy hh:nn:ss', Now());
      TDTempStr := TDTempStr + ': ' + Text;
      AssignFile(LogFile, filename);
      if not (FileExists(filename)) then
      begin
        Rewrite(logfile);
      end else begin
        Append(LogFile);
      end;
      Writeln(LogFile, TDTempStr);
      Flush(LogFile);
      CloseFile(LogFile);
    except
      errorlevel := 1; // Fehler
    end;
  end;
  result := errorlevel;
end;

function dateletters(_in : string) : string;
begin
  _in := trim(_in);
  if length(_in) = 1 then result := '0else result := '';
  result := result + _in;
end;
Wenn ich mit dem MemoryCheck rangehe, bekomme ich eine Virtual Alloc Meldung (siehe Sceenshot anbei).
Hat da mal jemand eine Idee?

Gruss

EL
Miniaturansicht angehängter Grafiken
snag-0069_801.gif  


Narben am Körper sind ein Zeichen dafür, das man gelebt hat.
Narben auf der Seele sind ein Zeichen dafür, das man geliebt hat.
  Mit Zitat antworten Zitat