Posible condición de carrera creando Estructuras en ColdFusion

He estado viendo errores intermitentes en un par de sistemas en los que he estado trabajando, cuando utilizo la misma metodología (no el mismo código), lo que me lleva a creer que el problema puede estar relacionado con la creación y el uso de estructuras en la misma solicitud. Me pregunto si es posible que haya una condición de carrera?

El escenario es el siguiente: estamos en un sistema de comercio electrónico, mirando un producto o, en algunos casos, una lista de productos. El código en cuestión está diseñado para devolver las imágenes asociadas con cada producto, en una estructura que podemos usar para mostrar dichas imágenes.

Al comienzo de la solicitud, el código busca los registros de la base de datos asociados con el elemento en cuestión. Estos registros representan imágenes para el producto (s). Estos registros se devuelven en un soloCFQuery llamada (o más exactamente, una llamada a una función que devuelve los resultados de unaCFQuery llamada, en forma de una estructura que contiene información diversa).

Luego, el código recorre la estructura de imagen suministrada y agrega información diversa a una estructura Local. Más adelante en la solicitud, utilizamos los datos de la estructura para mostrar las imágenes en nuestro<img> etiquetas También poblamos el<img> etiqueta condata- atributos para su uso con JavaScript.

En el caso de que la consulta no haya devuelto correctamente alguna imagen en particular, generalmente porque falta el archivo físico, usamos una imagen genérica de marcador de posición. Esto se hace poniendo la creación de la estructura dentro de untry/catch bloquear.

En tono rimbombante:esto funciona.

Lo que pasa sin embargo, es quemuy intermitentementeCuando nos referimos a un nodo en la estructura que hemos creado, descubrimos que no existe y CF arroja un error: esto ocurre quizás un 1% del tiempo y al volver a cargar la misma página, todo funcionará perfectamente.

He tenido este mismo problema en múltiples sistemas, en múltiples servidores, en diferentes versiones de ColdFusion (8 y 10 para ser específicos) y usando un código completamente diferente para lograr resultados similares. El primer sistema en el que vi este problema, realmente usadoFileExists para comprobar que el archivo de imagen estaba disponible y, por lo tanto, pensé que el problema probablemente se debió al cuello de botella del sistema de archivos; traté de evitarlo y finalmente lo eliminé por completo en el nuevo sistema, pero el problema persiste.

Lo único en lo que puedo pensar es que cuando se crea una estructura y luego se usa esa estructura más adelante en la misma solicitud, existe la posibilidad de que ocurra una condición de carrera; por lo que me refiero a un nodo en la estructura antes de que se haya creado. Sin embargo, no estoy usando hilos aquí, así que realmente no puedo ver cómo eso es posible ... Me he quedado sin otras ideas.

Abajo hay un código para mostrar lo que estoy haciendo, pero dado que el mismo problema surge en sistemas completamente diferentes, creo que es la metodología y no el código el que tiene un problema.

<!--- 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>

El error se produce en el<img> etiqueta, cuando se refiere a un nodo creado en el código anterior - Algo como:

El elemento ImageURL_image_02_Large no está definido en un objeto Java de la clase de tipo coldfusion.runtime.LocalScope.

Pero solo de vez en cuando ... recargaré y funcionará perfectamente cada vez.

Entonces ... perdón por la epopeya de la pregunta, pero ¿alguien puede ver cómo podría ocurrir esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta