Mögliche Racebedingung beim Erstellen von Strukturen in ColdFusion

Bei einigen Systemen, an denen ich gearbeitet habe, sind zeitweise Fehler aufgetreten, die mich zu der Annahme veranlassten, dass das Problem möglicherweise mit dem Erstellen und Verwenden von Strukturen in derselben Anforderung zusammenhängt. Ich frage mich, ob es möglich ist, dass es eine Rennbedingung gibt.

Das Szenario lautet wie folgt: Wir befinden uns in einem E-Commerce-System und sehen uns ein Produkt oder in einigen Fällen eine Liste von Produkten an. Der fragliche Code soll die mit jedem Produkt verbundenen Bilder in einer Struktur zurückgeben, die wir für die Anzeige dieser Bilder verwenden können.

Zu Beginn der Anforderung sucht der Code nach Datenbankdatensätzen, die dem betreffenden Element zugeordnet sind. Diese Aufzeichnungen repräsentieren Bilder für das / die Produkt (e). Diese Datensätze werden in einem einzigen zurückgegebenCFQuery call (oder genauer gesagt ein Aufruf einer Funktion, die die Ergebnisse von a zurückgibtCFQuery call, geformt zu einer Struktur mit verschiedenen Informationen).

Der Code durchläuft dann die bereitgestellte Bildstruktur und fügt einer lokalen Struktur verschiedene Informationen hinzu. Später in der Anfrage verwenden wir die Daten in der Struktur, um die Bilder in unserer anzuzeigen<img> Stichworte. Wir bevölkern auch die<img> tag mitdata- Attribute zur Verwendung mit JavaScript.

Für den Fall, dass ein bestimmtes Bild von der Abfrage nicht korrekt zurückgegeben wurde - normalerweise, weil die physische Datei fehlt - verwenden wir ein generisches Platzhalterbild. Dies geschieht durch Platzieren der Strukturerstellung in atry/catch Block.

Wichtig ist:das funktioniert.

Was jedoch passiert, ist dassehr zeitweiseWenn wir auf einen Knoten in der von uns erstellten Struktur verweisen, stellen wir fest, dass dieser nicht vorhanden ist und CF einen Fehler auslöst - dies passiert möglicherweise 1% der Zeit, und wenn dieselbe Seite erneut geladen wird, funktioniert alles einwandfrei.

Ich hatte das gleiche Problem auf mehreren Systemen, auf mehreren Servern, auf verschiedenen Versionen von ColdFusion (8 und 10, um genau zu sein) und unter Verwendung völlig unterschiedlichen Codes, um ähnliche Ergebnisse zu erzielen. Das erste System, auf dem ich dieses Problem gesehen habe, wurde tatsächlich verwendetFileExists um zu überprüfen, ob die Image-Datei verfügbar war und ich dachte, dass das Problem wahrscheinlich durch den Engpass des Dateisystems verursacht wurde - ich habe viele Möglichkeiten ausprobiert und es schließlich im neuen System vollständig beseitigt -, aber das Problem bleibt bestehen.

Das Einzige, woran ich denken kann, ist, dass beim Erstellen einer Struktur und beim späteren Verwenden dieser Struktur in derselben Anforderung die Möglichkeit besteht, dass eine Race-Bedingung eintritt. Dabei verweise ich auf einen Knoten in der Struktur, bevor die Erstellung abgeschlossen ist. Ich verwende hier jedoch kein Threading, daher kann ich nicht wirklich erkennen, wie das möglich ist. Ich habe keine anderen Ideen.

Nachfolgend finden Sie einen Code, der zeigt, was ich tue. Da dasselbe Problem jedoch auf völlig unterschiedlichen Systemen auftritt, liegt das Problem meines Erachtens eher in der Methodik als im Code.

<!--- Get product images --->
<cfset Local.stProductImages = Application.cfcParts.getPartImages(
        l_iItemID = Arguments.pid
) />


<!--- Loop through images --->
<cfloop list="#ListSort(structKeyList(Local.stProductImages['item_' & Arguments.pid]), 'text')#" index="i">
    <cftry>
        <cfset Local['ImageURL_' & i & '_Large']    = Local.stProductImages['item_' & Local.arguments.pid][i].large_watermarked.URL />
        <cfcatch>
            <cfset Local['ImageURL_' & i & '_Large']    = Application.com.Images.getMissingImages().large />
        </cfcatch>
    </cftry>                        
    <cftry>
        <cfset Local['ImageURL_' & i & '_Med']      = Local.stProductImages['item_' & Local.arguments.pid][i].med.URL />
        <cfcatch>
            <cfset Local['ImageURL_' & i & '_Med']      = Application.com.Images.getMissingImages().med />
        </cfcatch>
    </cftry>                        
    <cftry>
        <cfset Local['ImageURL_' & i & '_Small']        = Local.stProductImages['item_' & Local.arguments.pid][i].small.URL />
        <cfcatch>
            <cfset Local['ImageURL_' & i & '_Small']        = Application.com.Images.getMissingImages().small />
        </cfcatch>
    </cftry>                        

    <img class          = "altProdImg<cfif i EQ 'image_03'> endImage</cfif>" 
        src             = "#Local['ImageURL_' & i & '_Small']#" 
        image           = "#i#" 
        alt             = ""
        data-imgsmall   = "#Local['ImageURL_' & i & '_Small']#"
        data-imgmed     = "#Local['ImageURL_' & i & '_Med']#"
        data-imglarge   = "#Local['ImageURL_' & i & '_Large']#"
        data-imgnum     = "#i#"
        data-pid        = "#Arguments.pid#"
    />
</cfloop>

Der Fehler tritt in der auf<img> Tag, wenn auf einen Knoten verwiesen wird, der im vorhergehenden Code erstellt wurde - Etwas wie:

Das Element ImageURL_image_02_Large ist in einem Java-Objekt der Typklasse coldfusion.runtime.LocalScope undefiniert.

Aber nur sehr gelegentlich ... Ich werde nachladen und es wird jedes Mal perfekt funktionieren.

Also ... Entschuldigung für die epische Länge der Frage, aber kann jemand sehen, wie das passieren könnte?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage