OVH Cloud OVH Cloud

Urgent ADO - avis aux experts

6 réponses
Avatar
Daryl
Bonjour,


J'ai remarqué des pb de preformance dans mon application VB/ADO/SQL Server,
j'ai observé que cela provient de la déclaration des tables. En effet le cas
n°1 (voir code ci-dessous) est plus lent que le cas n°2 (voir code
ci-dessous) et du N°3 (voir code ci-dessous).

Pourquoi ? Y-a-t-il une différence entre le cas numéro 2 et numéro 3 ? Que
choisir ?.

Cas n°1 : Pas de fermeture de la table avec : set TABLE = nothing

Dim BASE As ADODB.Connection
Set BASE = New ADODB.Connection
Dim TABLE1 As New ADODB.Recordset
Set TABLE1 = New ADODB.Recordset
Dim TABLE2 As New ADODB.Recordset
Set TABLE2 = New ADODB.Recordset

[ Traitement avec un open recordset ]
TABLE1.close

[ Traitement avec un open recordset ]
TABLE2.close

BASE .close
Set BASE = nothing

Cas n°2 : Fermeture de la table avec : set TABLE = nothing

Dim BASE As ADODB.Connection
Set BASE = New ADODB.Connection
Dim TABLE1 As New ADODB.Recordset
Set TABLE1 = New ADODB.Recordset
Dim TABLE2 As New ADODB.Recordset
Set TABLE2 = New ADODB.Recordset

[ Traitement avec un open recordset ]
TABLE.close
Set TABLE1 = nothing

[ Traitement avec un open recordset ]
TABLE2.close
Set TABLE2 = nothing

BASE .close
Set BASE = nothing

Cas n°3 : Pas de déclaration avec : set TABLE =

Dim BASE As ADODB.Connection
Set BASE = New ADODB.Connection
Dim TABLE1 As New ADODB.Recordset
Dim TABLE2 As New ADODB.Recordset

[ Traitement avec un open recordset ]
TABLE.close

[ Traitement avec un open recordset ]
TABLE2.close

BASE .close
Set BASE = nothing

6 réponses

Avatar
Zoury
Salut Daryl! :O)


j'ai observé que cela provient de la déclaration des tables. En effet le


cas
n°1 (voir code ci-dessous) est plus lent que le cas n°2 (voir code
ci-dessous) et du N°3 (voir code ci-dessous).



Tu as observé ça de quelle manière? si tu n'as fait qu'exécuter les trois
bouts de code les uns à la suite des autres, il m'apparaît normal que la
première fois soit la plus lente.. Il y a peut-être une histoire de cache là
dessous...

Pourquoi ? Y-a-t-il une différence entre le cas numéro 2 et numéro 3 ? Que
choisir ?.



dans ce cas-ci, les trois temps d'exécution devrait être semblable sinon
identique car dans les trois cas les objets sont placé à Nothing à la sortie
de la fonction.. Les objets étant instanciés dans une fonction ou une sub
sont libérés après celle-ci, s'ils sont instanciés au niveau d'un module,
ils seront libérés à la fermeture du programme.. dans un cas semblable il
est préférable de libéré explicitement ces objets.

lit aussi ce message concernant la déclaration de tes objets..
http://groups.google.com/groups?threadmæks%24bV4BHA.2816%40tkmsftngp05

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
jmn
Avec set truc= new ... la création de l'objet est réalisée de manière
dynamique lors de l'exécution et tous les traitements associés à
l'instanciation de l'objet sont faits à ce moment là.

Avec Dim truc as new... la référence à l'objet est résolue au moment de la
compilation et une partie des traitements associés sont réalisés
préalablement à l'exécution.

Par ailleurs,
objet.close demande à l'objet de procéder à sa fermeture (ce qui entraine
souvent des traitements spécifiques),
alors que set objet = nothing supprimer purement et simplement la référence
à l'objet (et les structures associées) de l'espace de travail (ce qui
revient 'en gros' à libérer de la mémoire et des pointeurs, ce qui va très
vite).
Avatar
Daryl
Merci à tous.

Donc si j'ai bien compris, comme je ne souhaites pas garder en cache les
recordsets, j'utilise le code "set matable=nothing" (après le close de ma
table) pour libérer l'espace mémoire et je déclare uniquement ma table avec
le code "dim matable As New ADODB.Recordset" ?

Merci




"jmn" a écrit dans le message de news:

Avec set truc= new ... la création de l'objet est réalisée de manière
dynamique lors de l'exécution et tous les traitements associés à
l'instanciation de l'objet sont faits à ce moment là.

Avec Dim truc as new... la référence à l'objet est résolue au moment de la
compilation et une partie des traitements associés sont réalisés
préalablement à l'exécution.

Par ailleurs,
objet.close demande à l'objet de procéder à sa fermeture (ce qui entraine
souvent des traitements spécifiques),
alors que set objet = nothing supprimer purement et simplement la


référence
à l'objet (et les structures associées) de l'espace de travail (ce qui
revient 'en gros' à libérer de la mémoire et des pointeurs, ce qui va très
vite).




Avatar
jmn
Au final, c'est a peu près ca, sinon qu'il ne s'agit pas de libérer des
caches de recordsets ou des recordsets en cache, mais des instances d'objet
qui gérent ces recordsets. Mais c'est un détail.
Avatar
Daryl
Merci encore
"jmn" a écrit dans le message de news:

Au final, c'est a peu près ca, sinon qu'il ne s'agit pas de libérer des
caches de recordsets ou des recordsets en cache, mais des instances


d'objet
qui gérent ces recordsets. Mais c'est un détail.




Avatar
Zoury
> Donc si j'ai bien compris, comme je ne souhaites pas garder en cache les
recordsets,
j'utilise le code "set matable=nothing" (après le close de ma
table) pour libérer l'espace mémoire et je déclare uniquement ma table


avec
le code "dim matable As New ADODB.Recordset"



en fait le Set... = Nothing est inutile car VB le fait tout seul après la
fonction.

et le

Dim ... As New ...

devrait être remplacé par :

Dim .. As ...
Set ... = New ...

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous