2013-11-08 5 views
4

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

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

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

+1

http://varscoper.riaforge.org/ –

+0

Не уверен, что я с тобой Питер. Я думал, что var scoping был для функций? Вызываемые функции (Application.cfcParts.getPartImages и Application.com.Images.getMissingImages) корректны для варскопинга - есть ли что-то, что я должен делать внутри .cfm? –

+0

Кроме того, просто запустить VarScoper на файл, о котором идет речь, и он вернулся ни с чем! Не могу быть уверенным, что я использую его правильно, но никогда не использовал его раньше. –

ответ

3

Ответ от комментариев ...

поведение вы описываете является симптомом не вар обзорного, так что это может быть просто исправить, как с помощью index="local.i" в cfloop тега (вам нужно только при записи переменной).


Примечание стороны: Относительно простой способ проверить, если вы находитесь в функции, без прохождения через код, это бросая ошибку (т.е. <cfthrow message="where am i?" />), а затем проверить трассировку стека - если вы видите такие вещи, как coldfusion.runtime.UDFMethod или $funcSTUFF.runFunction(filename:line) вы знаете, что находитесь внутри функции (даже если шаблон, в котором вы находитесь, не показывает никаких признаков).

 Смежные вопросы

  • Нет связанных вопросов^_^