Возможное состояние гонки при создании 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.
Но только очень редко ... Я перезагружаюсь, и это будет работать идеально каждый раз.
Итак ... извините за эпическую длину вопроса, но кто-нибудь может увидеть, как это могло произойти?