|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 6 ![]() |
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 :
|
||
|
|
00
|
|
|
#2 | |
|
Membre du Club
![]() |
Citation:
|
|
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 6 ![]() |
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; |
|
|
00
|
|
|
#4 | |||
|
Membre du Club
![]() |
Citation:
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 :
|
|||
|
|
00
|
|
|
#5 | |
|
Membre du Club
![]() |
Citation:
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. |
|
|
|
00
|
|
|
#6 | ||
|
Membre du Club
![]() ![]() Inscription : novembre 2005 Messages : 52 ![]() |
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 :
__________________
Henri Gourvest http://www.progdigy.com |
||
|
|
00
|
|
|
#7 | |||
|
Membre du Club
![]() ![]() Inscription : novembre 2005 Messages : 52 ![]() |
Citation:
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 :
__________________
Henri Gourvest http://www.progdigy.com |
|||
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : janvier 2006 Messages : 6 ![]() |
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. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com