Я наблюдаю прерывистые ошибки в нескольких системах, над которыми я работал, при использовании той же методологии (не такой же код), что заставляло меня думать, что проблема может быть связана с создание и использование структур в одном запросе. Мне интересно, возможно ли это состояние гонки?Возможные условия создания гонки в ColdFusion
Сценарий таков: Мы находимся на системе электронной коммерции, глядя на продукт или в некоторых случаях на список продуктов. Этот код предназначен для возврата изображений, связанных с каждым продуктом, в структуре, которую мы можем использовать для отображения указанных изображений.
В начале запроса код ищет записи базы данных, связанные с рассматриваемым предметом. Эти записи представляют собой изображения для продукта (ов). Эти записи возвращаются в одном вызове CFQuery
(или, точнее, вызове функции, которая возвращает результаты вызова CFQuery
, сформированного в структуру, содержащую различную информацию).
Код затем прорисовывается через предоставленную структуру изображения и добавляет различную информацию в локальную структуру. Позже в запросе мы используем данные в структуре для отображения изображений в наших тегах <img>
. Мы также заполняем тег <img>
атрибутами data-
для использования с JavaScript.
В случае, если какое-либо конкретное изображение не было правильно возвращено запросом - обычно из-за отсутствия физического файла - мы используем общий образ заполнителя. Это делается путем размещения структуры в блоке try/catch
.
Важно: это работает.
Что однако происходит, является то, что очень прерывисто, при обращении к узлу в структуры мы создали, мы находим, что оно не существует, и CF выдает ошибку - это случается, может быть, 1% времени и перезагрузка одной и той же страницы, все будет работать отлично.
У меня была такая же проблема для нескольких систем, на нескольких серверах, для разных версий ColdFusion (для конкретных случаев) и использования совершенно другого кода для достижения аналогичных результатов. В первой системе, в которой я видел эту проблему, на самом деле используется FileExists
, чтобы проверить, что файл изображения был доступен, и поэтому я думал, что проблема, вероятно, была вызвана узким местом файловой системы - я пробовал много способов обойти это и в конечном итоге полностью устранил его новая система - но проблема сохраняется.
Единственное, о чем я могу думать, это то, что при создании структуры и последующем использовании этой структуры позже в том же запросе существует вероятность того, что произойдет состояние гонки; поэтому я ссылаюсь на узел в структуре до того, как он будет создан. Я не использую threading здесь, хотя, поэтому я не могу понять, как это возможно ... Я из других идей.
Ниже приведен код, чтобы показать, что я делаю, но учитывая, что эта же проблема возникает в совершенно разных системах, я думаю, что это скорее методология, чем код, который имеет проблему.
<!--- 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.
Но только очень изредка ... Я перезагружу, и он будет работать идеально каждый раз.
Итак ... извините за эпическую длину вопроса, но может ли кто-нибудь увидеть, как это могло произойти?
http://varscoper.riaforge.org/ –
Не уверен, что я с тобой Питер. Я думал, что var scoping был для функций? Вызываемые функции (Application.cfcParts.getPartImages и Application.com.Images.getMissingImages) корректны для варскопинга - есть ли что-то, что я должен делать внутри .cfm? –
Кроме того, просто запустить VarScoper на файл, о котором идет речь, и он вернулся ни с чем! Не могу быть уверенным, что я использую его правильно, но никогда не использовал его раньше. –