Frank: Frage zu set object = nothing bei exit function/sub

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

  1. 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

    1. 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