Możliwa sytuacja wyścigu podczas tworzenia struktur w ColdFusion

Widziałem sporadyczne błędy w kilku systemach, nad którymi pracowałem, kiedy korzystałem z tej samej metodologii (nie tego samego kodu), co doprowadziło mnie do przekonania, że ​​problem może być związany z tworzeniem i używaniem struktur w tym samym żądaniu. Zastanawiam się, czy to możliwe, że istnieje sytuacja rasowa?

Scenariusz jest następujący: jesteśmy w systemie e-commerce, patrząc na produkt lub w niektórych przypadkach na listę produktów. Kod, o którym mowa, ma na celu zwrócenie obrazów związanych z każdym produktem, w strukturze, której możemy użyć do wyświetlania wspomnianych obrazów.

Na początku żądania kod szuka rekordów bazy danych powiązanych z danym przedmiotem. Te rekordy reprezentują obrazy produktu. Te rekordy są zwracane w jednymCFQuery wywołanie (a dokładniej wywołanie funkcji, która zwraca wyniki a.)CFQuery wywołanie, ukształtowane w strukturę zawierającą różne informacje).

Kod następnie przechodzi przez dostarczoną strukturę obrazu i dodaje różne informacje do struktury lokalnej. Później w żądaniu używamy danych w strukturze do wyświetlania obrazów w naszym<img> tagi. Wypełniamy również<img> znacznik zdata- atrybuty do użycia z JavaScript.

W przypadku, gdy jakikolwiek konkretny obraz nie został poprawnie zwrócony przez kwerendę - zwykle z powodu braku fizycznego pliku - używamy ogólnego obrazu zastępczego. Odbywa się to poprzez umieszczenie struktury struct wewnątrz atry/catch blok.

Co ważne:to działa.

Co jednak się dziejebardzo sporadycznie, odnosząc się do węzła w utworzonej przez nas strukturze, okazuje się, że nie istnieje, a CF zgłasza błąd - zdarza się to 1% czasu i ponowne załadowanie tej samej strony, wszystko będzie działać idealnie.

Miałem ten sam problem w wielu systemach, na wielu serwerach, w różnych wersjach ColdFusion (konkretnie 8 i 10) i przy użyciu zupełnie innego kodu, aby uzyskać podobne wyniki. Pierwszy system, w którym widziałem ten problem, faktycznie używanyFileExists aby sprawdzić, czy plik obrazu jest dostępny, i dlatego pomyślałem, że problem jest prawdopodobnie spowodowany wąskim gardłem systemu plików - próbowałem tego na wiele sposobów i ostatecznie wyeliminowałem go całkowicie w nowym systemie - ale problem nadal występuje.

Jedyną rzeczą, o której mogę myśleć, jest to, że podczas tworzenia struktury, a następnie używania tej struktury później w tym samym żądaniu, istnieje możliwość, że wystąpi sytuacja wyścigu; przez co odwołuję się do węzła w strukturze przed jego zakończeniem. Nie używam tutaj wątków, więc nie widzę, jak to jest możliwe ... Nie mam innych pomysłów.

Poniżej przedstawiono kod, aby pokazać, co robię, ale biorąc pod uwagę, że ten sam problem pojawia się w zupełnie innych systemach, myślę, że to raczej metodologia niż kod ma problem.

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

Błąd występuje w<img> tag, odnosząc się do węzła utworzonego w poprzednim kodzie - Coś w stylu:

Element ImageURL_image_02_Large jest niezdefiniowany w obiekcie Java klasy type coldfusion.runtime.LocalScope.

Ale tylko bardzo rzadko ... Przeładuję i będzie działać idealnie za każdym razem.

Więc ... przepraszam za epicką długość pytania, ale czy ktoś może zobaczyć, jak mogłoby to nastąpić?

questionAnswers(1)

yourAnswerToTheQuestion