Précédent   Forum des professionnels en informatique > Bases de données > Firebird > Connexion aux bases de données
Connexion aux bases de données Forum d'entraide sur la connectivité Firebird: composants, drivers, transactions, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/10/2007, 16h42   #1
Invité de passage
 
Inscription : janvier 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 6
Points : 3
Points : 3
Par défaut [UIB] Fuite mémoire virtuelle

Sous XP avec Firebird2 et UIB 2.1

Dans le cadre d'un test pour une plate- Forme de pool de connections.

La procedure :
1. création du composant TJvUIBDataBase
2. connection/deconnection
3. Libération du composant

ceci 1000 fois, ce qui génère une fuite dans la mémoire virtuelle de 60 Mo.

Quelqu'un a une idée ?
La même procédure avec FIBPLUS ne pose pas de problèmes.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure TForm1.Button3Click(Sender: TObject);
var
 JvUIBDataBase:TJvUIBDataBase;
 i:integer;
 begin
 FOR i:=1 TO 1000 do
   begin
    JvUIBDataBase:=TJvUIBDataBase.CREATE(nil);
 
   WITH JvUIBDataBase do
  begin
  Params.ADD('user_name=SYSDBA');
  Params.ADD('password=masterkey');
  Params.ADD('sql_dialect=3');
  Params.ADD('lc_ctype=ISO8859_1');
 
  DatabaseName := 'c:\novaxel\bases\perso\essai.fdb';
  CharacterSet := csISO8859_1;
  UserName := 'SYSDBA';
  PassWord := 'masterkey';
  LibraryName := 'C:\WINDOWS\SYSTEM32\fbclient.dll';
 end;
 jvUIBDataBase.Connected:=True;
 jvUIBDataBase.Connected:=False;
 Application.ProcessMessages;
 JvUIBDataBase.free;
end;
end;
mmollon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 00h30   #2
Membre du Club
 
Inscription : mai 2002
Messages : 56
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : mai 2002
Messages : 56
Points : 65
Points : 65
Envoyer un message via ICQ à PierreY
Citation:
Envoyé par mmollon Voir le message
Sous XP avec Firebird2 et UIB 2.1

Dans le cadre d'un test pour une plate- Forme de pool de connections.

La procedure :
1. création du composant TJvUIBDataBase
2. connection/deconnection
3. Libération du composant

ceci 1000 fois, ce qui génère une fuite dans la mémoire virtuelle de 60 Mo.

Quelqu'un a une idée ?
Je pense à tester ça demain. Est-ce que tu as essayé avec FastMM4, est-ce qu'il te remonte un problème ?
PierreY est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 09h34   #3
Invité de passage
 
Inscription : janvier 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 6
Points : 3
Points : 3
Par défaut [UIB] Fuite mémoire virtuelle

Bonjour

J'ai tester avec MemCheck et maintenant avec FastMM4.
Les deux me disent qu'il n'y a pas de fuites mémoire à la sortie du programme.

Avec FastMM4 on voit bien ce qu'il se passe dans la form présentant l'utilisation de la mémoire ( ShowFastMMUsageTracker).On voit la mémoire utilisé qui augment au fur à mesure.

Avec le gestionnaire de tache on voit que ce n'est que la mémoire virtuelle qui n'est pas libéré.

En faisant la même boucle avec les composant FIBPLus je n'est pas ce problème.
Je vient de remarquer un truc bizarre. Dans un même programme, si je commence par la boucle avec FIBPLUS puis que j'appelle la boucle avec UIB,
alors je n'est plus de fuite mémoire virtuelle.

Avec FIBPlus : pas de fuite

procedure TForm1.Button4Click(Sender: TObject);
var
i:integer;
pFIBDatabase:TpFIBDatabase;
begin
for i:=1 to 1000 do
begin
pFIBDatabase:=TpFIBDatabase.Create(nil);
with pFIBDatabase do
begin
DBName := 'C:\novaxel\bases\PERSO\NOVAXEL.FDB';
DBParams.Add('user_name=SYSDBA');
DBParams.Add('password=masterkey');
DBParams.Add('sql_dialect=3');
DBParams.Add('lc_ctype=ISO8859_1');
Timeout := 0;
LibraryName := 'C:\WINDOWS\SYSTEM32\fbclient.dll';
WaitForRestoreConnect := 0;

pFIBDatabase1.Connected:=True;
pFIBDatabase1.Connected:=False;
Application.ProcessMessages;
end;
pFIBDatabase.Free;
end;
end;
mmollon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 09h55   #4
Membre du Club
 
Inscription : mai 2002
Messages : 56
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : mai 2002
Messages : 56
Points : 65
Points : 65
Envoyer un message via ICQ à PierreY
Citation:
Envoyé par mmollon Voir le message
Bonjour

J'ai tester avec MemCheck et maintenant avec FastMM4.
Les deux me disent qu'il n'y a pas de fuites mémoire à la sortie du programme.
Tout comme AQTime 5. Je me demande si ce n'est pas simplement lié au fait que JvUIBDatabase embarque UIBLibrary qui est le wrapper sur l'API de firebird.

Peut-être que FIB+ ne crée le wrapper qu'une seule fois dans une sorte de singleton qu'il réutilise pour chaque Database créé ?

Question "Design" : pourquoi créer et détruire les composants à chaque fois ? Ne serait-ce pas plus représentatif du fonctionement réel d'un pool de connexion que d'en créer un certain nombre d'avance que ton pool utiliserait sur demande (Application.ProcessMessages) pour les détruire tout à la fin ?

Quelque chose qui ressemblerait plus à ça ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
procedure TForm1.Button1Click(Sender: TObject);
var
 Dbs: array[1..1000] of TJvUIBDataBase;
 i: Integer;
begin
 FOR i := 1 TO 1000 do
 begin
   Dbs[i] := TJvUIBDataBase.CREATE(nil);
 
   WITH Dbs[i] do
   begin
     LibraryName := 'C:\Program Files\Firebird\bin\fbclient.dll';
 
     Params.ADD('user_name=SYSDBA');
     Params.ADD('password=masterkey');
     Params.ADD('sql_dialect=3');
     Params.ADD('lc_ctype=ISO8859_1');
 
     DatabaseName := 'F:\BDD\Test\MemoryTests.fdb';
     CharacterSet := csISO8859_1;
     UserName := 'SYSDBA';
     PassWord := 'masterkey';
   end;
 
   Dbs[i].Connected := True;
 end;
 
 Application.ProcessMessages;
 
 FOR i := 1 TO 1000 do
 begin
   Dbs[i].Connected := False;
   Dbs[i].Free;
 end;
end;
PierreY est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 10h11   #5
Membre du Club
 
Inscription : mai 2002
Messages : 56
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : mai 2002
Messages : 56
Points : 65
Points : 65
Envoyer un message via ICQ à PierreY
Citation:
Envoyé par PierreY Voir le message
Tout comme AQTime 5. Je me demande si ce n'est pas simplement lié au fait que JvUIBDatabase embarque UIBLibrary qui est le wrapper sur l'API de firebird.
D'ailleurs puisqu'on en est à regarder les indicateurs d'utilisation de la mémoire de Windows, moi, avec le dernier code que j'ai posté, je ne monte, au maximum qu'à 8.5Mo de mémoire virtuelle, FastMM4 en Full Debug, avec les cadres de pile, toutes les infos de débogage, hors IDE comme dans l'IDE (Delphi 2006)

Je crois que tu ne mesures pas les bonnes choses en fait. L'utilisation de la mémoire virtuelle, en soi, n'est pas un problème.
PierreY est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 10h35   #6
Membre du Club

 
Inscription : novembre 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 52
Points : 57
Points : 57
En effet ca vient du chargement de la dll cliente,
et plus précisément du chargement/déchargement successif de la dll.
Le probleme ne se pose pas si il existe au moins une connexion à la dll, ce qui est le cas d'un pool de connexions.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
*PAS BIEN*
var
  lib: TUIBLibrary;
  i: integer;
begin
 lib := TUIBLibrary.CREATE;
 FOR i := 1 TO 1000 do
 begin
   lib.LOAD;
   lib.Unload;
 end;
 lib.free;
end;
 
*BIEN*
var
  list: TObjectList;
  lib: TUIBLibrary;
  i: integer;
begin
  list := TObjectList.CREATE;
  FOR i := 1 TO 1000 do
  begin
    lib := TUIBLibrary.CREATE;
    lib.LOAD;
    list.ADD(lib)
  end;
  list.Free;
end;
PS: Il y a un exemple de pool de connexion dans misc/appserveur
__________________
Henri Gourvest
http://www.progdigy.com
hgourvest est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 11h07   #7
Membre du Club

 
Inscription : novembre 2005
Messages : 52
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 52
Points : 57
Points : 57
Citation:
Envoyé par mmollon Voir le message
Je vient de remarquer un truc bizarre. Dans un même programme, si je commence par la boucle avec FIBPLUS puis que j'appelle la boucle avec UIB,
alors je n'est plus de fuite mémoire virtuelle.
Parce que FIBPLUS a guardé la dll chargée, et donc windows n'a pas eu besoin de la recharger. En effet windows effectue un comptage de référence sur le chargement et déchargement de la dll.

par exemple ce code ne pose plus aucun probleme, alors que je charge et décharge la dll 1000 fois. Mais comme il y a toujours au moins une connexion à la dll, celle ci est réutilisée par windows.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
procedure TForm1.Button1Click(Sender: TObject);
var
  lib, lib2: TUIBLibrary;
  i: integer;
begin
 lib2 := TUIBLibrary.CREATE;
 lib2.LOAD;
 lib := TUIBLibrary.CREATE;
 FOR i := 1 TO 1000 do
 begin
   lib.LOAD;
   lib.Unload;
 end;
 lib.free;
 lib2.Free;
end;
__________________
Henri Gourvest
http://www.progdigy.com
hgourvest est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 11h52   #8
Invité de passage
 
Inscription : janvier 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 6
Points : 3
Points : 3
Merci beaucoup pour votre aide

Je vais pouvoir continuer avec les composants UIB que je trouve très bon.
En plus ils sont compatible avec FreePascal.

Cordialement.
mmollon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h29.


 
 
 
 
Partenaires

Hébergement Web