Возможное состояние гонки при создании Struts в ColdFusion

Я видел периодически возникающие ошибки в нескольких системах, над которыми работал, когда использовал одну и ту же методологию (не один и тот же код), что наводило меня на мысль, что проблема может быть связана с созданием и использованием структур в одном запросе. Я задаюсь вопросом, возможно ли, что есть условие гонки?

Сценарий таков: мы находимся в системе электронной коммерции, смотрим на продукт или, в некоторых случаях, список продуктов. Рассматриваемый код предназначен для возврата изображений, связанных с каждым продуктом, в структуре, которую мы можем использовать для отображения указанных изображений.

В начале запроса код ищет записи базы данных, связанные с рассматриваемым элементом. Эти записи представляют изображения для продукта (ов). Эти записи возвращаются в одномCFQuery вызов (или, точнее, вызов функции, которая возвращает результатыCFQuery вызов, сформированный в структуру, содержащую различную информацию).

Затем код перебирает предоставленную структуру изображения и добавляет различную информацию в локальную структуру. Позже в запросе мы используем данные в структуре для отображения изображений в нашем<img> теги. Мы также заполняем<img> пометить сdata- атрибуты для использования с JavaScript.

В случае, если какое-либо конкретное изображение не было правильно возвращено запросом - обычно из-за отсутствия физического файла - мы используем универсальное изображение-заполнитель. Это делается путем помещения создания структуры внутриtry/catch блок.

Важно отметить:это работает.

Однако происходит то, чтоочень периодическикогда мы ссылаемся на узел в созданной нами структуре, мы обнаруживаем, что он не существует, и CF выдает ошибку - это происходит, может быть, в 1% случаев, и при перезагрузке той же страницы все будет отлично работать.

У меня была одна и та же проблема на нескольких системах, на нескольких серверах, в разных версиях ColdFusion (в частности, 8 и 10) и при использовании совершенно другого кода для достижения схожих результатов. Первая система, на которой я видел эту проблему, фактически использоваласьFileExists чтобы проверить, доступен ли файл образа, и, таким образом, я подумал, что проблема, вероятно, была вызвана узким местом файловой системы - я пытался обойти это во многих случаях и в конечном итоге полностью исключил его в новой системе - но проблема сохраняется.

Единственное, о чем я могу думать, это то, что при создании структуры и последующем использовании этой структуры в том же запросе существует вероятность возникновения условия гонки; посредством чего я ссылаюсь на узел в структуре, прежде чем он будет завершен. Я здесь не использую многопоточность, поэтому не могу понять, как это возможно ... У меня нет других идей.

Ниже приведен код, показывающий, что я делаю, но, учитывая, что та же проблема возникает в совершенно разных системах, я думаю, что проблема заключается не в коде, а в методологии.

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

Ошибка возникает в<img> тег, когда ссылается на узел, созданный в предыдущем коде - что-то вроде:

Элемент ImageURL_image_02_Large не определен в Java-объекте типа класса coldfusion.runtime.LocalScope.

Но только очень редко ... Я перезагружаюсь, и это будет работать идеально каждый раз.

Итак ... извините за эпическую длину вопроса, но кто-нибудь может увидеть, как это могло произойти?

Ответы на вопрос(1)

Ваш ответ на вопрос