"Anders Holbøll" <dev-null-20010820@serveren.dk> skrev i en meddelelse
news:3B89444C.7B7E765C@serveren.dk...
> "Thomas L. Nielsen" wrote:
> >
> > Ok. Det vil så i teorien sige at i længden vil dette fylde min
> > server hukommelse pga. memory leaks ?
> > [Kode, hvor Rs tildeles et åbent recordset, som ikke lukkes]
> > Set Rs = Nothing 'Lukkes ikke helt ??
> > Conn.Close
> > Set Conn = Nothing
>
> Nu sagde jeg jo godt nok, at memory leaks hang sammen med et manglene
> "Set rs=nothing" (og her er det rs.close, der mangler), mon jo, det
> kunne man godt forestille sig. Men jeg tror nu ikke du direkte får
> memory leaks (hvor hukommelse går tabt "for evigt"). Jeg tror blot at
> vb-script fortolkeren er længere tid om at frigive hukommelsen.
Yep, garbage collectoren sørger for at rydde objekterne op for dig, det
giver lidt bedre performance hvis du husker at frigive dine objekter
eksplicit med
Set objEkt = Nothing
Men det er ikke noget der spiller den store rolle for de fleste, det
vigtigst ved at sætte et objekt = Nothing er at man kan se i koden at nu er
man færdig med at bruge det objekt, det gør koden mere let-læselig når man
skal rette i den igen om 6 mnd.
En ældre version af MDAC (Microsoft Data Access Components) dvs. ADO havde
fejl i Garbage Collecteren. Fejlen gjorde at du fik fejl på din side hvis du
glemet at frigive dine ADO objekter med Set = Nothing, den fejl er dog
rettet for længst (jeg mener det var ADO 2.1 der havde problemet).
> I dette tilfælde hvor du ikke lukker recordset'et, tror jeg også der er
> risiko for, at du belaster databasen. Når du på denne måde ikke siger
> ordenligt "farvel" til den, så ved den ikke, at du er færdig med den og
> holder måske nogle cursors åbne. Det kan du være, at når du lukker Conn,
> som er den forbindelse, som recordset'et er åbnet igennem, så lukker den
> også recordsette for dig.
Ja, det er til gengæld noget der kan gøre en lidt større forskel for
performance, det er med at få lukket sine database forbindelser så hurtigt
som muligt. Den bedste strategi er at benytte clientside cursors, dvs.
forbindelsen til databasen lukkes med det samme. Da det ikke altid er
hensigtsmæssigt at benytte client side cursors er det i disse tilfælde
vigtigt at kalde .Close lige så snart du er færdig med at bruge dit
recordset.
Et af rådende i konklusionen på nedenstående suveræne artikel er: "Use
stateless database operations and always use disconnected recordsets."
<
http://msdn.microsoft.com/library/en-us/dnnile/html/docu2kbench.asp>
MVH
Allan Ebdrup