Frage zu set object = nothing bei exit function/sub
Frank
- asp.net
0 Stefan Falz0 Frank
Hi liebe Genossen :-)
seit längerem beschäftigt mich folgende Frage, was passiert mit einem Objekt, z.b. ADODB.Recordset, wenn ich es innerhalb einer Prozedur oder Funktion nicht mit set object = nothing explizit "töte"? Beispiel:
function checkTriggers(triggerlist)
'prüfen ob die Trigger, die gesetzt sein müssen auch wirklich gesetzt sind und ob die Trigger, die nicht gesetzt sein dürfen auch wirklich nicht gesetzt sind
triggerArray = Split(triggerlist,",")
For each trigg in triggerArray
triggNum = CStr(Mid(trigg,2))
xpath_trigger = "//config[@id='" & ccube & "']/hdata/triggerset/trigger[text()='" & triggNum & "']"
set rs_xptrig = customerXML.documentElement.selectNodes(xpath_trigger)
IF Left(trigg,1) = "+" THEN
'dann soll der Trigger auch wirklich gesetzt sein
IF not rs_xptrig.length > 0 THEN
'der Trigger wurde nicht gefunden, Test nicht bestanden,
checkTriggers = False
exit function
END IF
ELSE
IF rs_xptrig.length > 0 THEN
'der Trigger wurde gefunden, sollte aber nicht also Test nicht bestanden
checkTriggers = False
exit function
END IF
END IF
set rs_xptrig = nothing
NEXT
checkTriggers = True
end function
Hierbei wird ja zwangsweise die Funktion verlassen (deren Rückgabewert auf False gesetzt) wenn ein entsprechendes Ereignis (XMLNodes gefunden oder nicht) eintritt.
Macht es Sinn, vor exit function noch ein set rs_xptrig = nothing reinzusetzen oder killt sich dieses Objekt automatisch durch verlassen der Prozedur? Hat das weglassen evt. negative Auswirkung auf die Anwendungsperformance?
Leider konnte ich zu dem Thema keine aussagekräftige Ressource ausfindig machen, falls jemand einen Link weiß oder gar gleich eine Antwort geben könnte, würde ich mich sehr freuen. Vielen Dank schon mal im Voraus.
Grüße, Frank
Hallo Frank,
seit längerem beschäftigt mich folgende Frage, was passiert mit einem Objekt, z.b. ADODB.Recordset, wenn ich es innerhalb einer Prozedur oder Funktion nicht mit set object = nothing explizit "töte"? Beispiel:
laut MS werden Objekte mit nach Abarbeitung des Skripts (nicht
der Sub, Function, ...) autom. terminiert. Allerdings zeigt die
Erfahrung, dass dem nicht so ist.
Die einhellige Meinung derer, dies wirklich mal ausprobiert
haben, ist, dass _jedes_ Objekt explizit terminiert werden
sollte. Stellenweise bedeutet dass zwar einigen Aufwand (meist,
wenns nachträglich gemacht werden muss ;), aber wenn man
von vorneherein eine saubere Struktur drinhat, gehts relativ
problemlos.
Gerade bei ADO besteht z.B. das Problem mit dem Connection-Pooling.
Dies sorgt dafür, dass frei gewordene Verbindungen wiederverwendet
werden können. Wenn die Connections aber nicht explizit zerstört
werden, dauert es seine Zeit, bis IIS das macht (wenn er irgendwann
mal Zeit dazu hat, was auf einem richtigen Webserver wohl eher
nicht der Fall sein wird). Die Connections werden dann gecacht,
aber nicht mehr wiederverwendet, da der Status immer noch "In
Benutzung" ist.
HTH,
Stefan
Hallo Frank,
seit längerem beschäftigt mich folgende Frage, was passiert mit einem Objekt, z.b. ADODB.Recordset, wenn ich es innerhalb einer Prozedur oder Funktion nicht mit set object = nothing explizit "töte"? Beispiel:
laut MS werden Objekte mit nach Abarbeitung des Skripts (nicht
der Sub, Function, ...) autom. terminiert. Allerdings zeigt die
Erfahrung, dass dem nicht so ist.
Die einhellige Meinung derer, dies wirklich mal ausprobiert
haben, ist, dass _jedes_ Objekt explizit terminiert werden
sollte. Stellenweise bedeutet dass zwar einigen Aufwand (meist,
wenns nachträglich gemacht werden muss ;), aber wenn man
von vorneherein eine saubere Struktur drinhat, gehts relativ
problemlos.
Gerade bei ADO besteht z.B. das Problem mit dem Connection-Pooling.
Dies sorgt dafür, dass frei gewordene Verbindungen wiederverwendet
werden können. Wenn die Connections aber nicht explizit zerstört
werden, dauert es seine Zeit, bis IIS das macht (wenn er irgendwann
mal Zeit dazu hat, was auf einem richtigen Webserver wohl eher
nicht der Fall sein wird). Die Connections werden dann gecacht,
aber nicht mehr wiederverwendet, da der Status immer noch "In
Benutzung" ist.
HTH,
Stefan
Hi Stefan,
danke, hat geholfen, dann werd ich entsprechend das Objekt aus meinem Beispiel explizit auf nothing setzen, bevor exit function kommt.
Schön mal wieder was von dir zu lesen.
Viele Grüße,
Frank