2010-10-05 94 views
0

在我的代碼中,我發出一個http請求(使用cfhttp)並將結果存儲在一個變量中。 http請求確實返回結果 - 我知道這是因爲我記錄了請求的時間和結果。保存http請求結果的變量是未定義的

但是,有時將某個http請求(cfhttp.filecontent)的結果存儲在一個變量中會出現問題,因爲後來,當我將另一個變量設置爲第一個變量時,第一個變量偶爾會引發錯誤(「元素保險-233在引用爲表達式一部分的CFML結構中未定義。」)。當我轉儲出會話變量時,該元素肯定不在那裏。我無法弄清楚導致錯誤發生的原因。

這裏是代碼(稍加修改,但實質上足以說明我在說什麼,修剪被添加進去,希望能夠解決錯誤。 #到更多語法正確的「保險#myNum的#」,但對於這個例子我留在其原始狀態,以顯示它如何是最後一次拋出的錯誤)。

<cfloop query="myQuery"> <!--- one of the query columns is myNum---> 
    <cflock scope="session" type="exclusive" timeout="10"> 
     <cfset session.report.mydata["insurance_" & #myNum#] = cfhttp.filecontent> 
    </cflock> 
    <cfset request.report.mydata["insurance_" & #myNum#] = trim(session.report.mydata["insurance_" & #myNum#])> 
</cfloop> 
+0

缺少英鎊是否在myNum的最後一個簽名錯誤?這不是在你的實際代碼中,對吧? – 2010-10-05 16:03:34

+0

是的,這是一個錯字 - 我會改變它,謝謝! – dmr 2010-10-05 16:19:23

回答

2

您沒有鎖定負責設置myNum值的邏輯。如果同時處理多個請求,則可能會出現以下情況。

Request 1: sets myNum to 33 
Request 1: writes data to session using myNum as the index; i.e. session[33] 
Request 2: sets myNum to 34 
Request 1: reads data from session using myNum as the index; i.e. session[34] 
Request 2: writes data to session using myNum as the index; i.e. session[34] 

因此,由於請求2已遞增的索引/ myNum的但還沒有寫入任何數據請求1試圖從一個未定義的位置讀取。

+0

根據您的回覆,我意識到我提供的代碼示例並不完全準確。 myNum實際上是從我正在循環的查詢中讀取的......我將修改我的代碼。如果可以,請讓我知道你的答案是否仍然適用。 – dmr 2010-10-06 15:21:17

+0

好問題。我不是百分百的,但是在使用CFC時,這是一個很好的做法。 ... 。 L中的所有變量都是線程安全的,所以我描述的情況不會發生。 – 2010-10-06 16:27:36

+0

我最終做的和你指出的有關。我沒有鎖定每個cfset,而是在整個循環周圍放置了一個cflock。它現在似乎正在工作。謝謝! – dmr 2010-10-07 16:50:55

2

除非你使用CF5或更低版本,您不需要使用範圍鎖定。我不再使用鎖,除非它們被命名爲特定競爭條件的鎖。另外,如果你在沒有完成寫操作的情況下鎖定10秒,它將完全繞過寫操作,你不會知道它。這可能是發生了什麼事。嘗試在cflock中添加「throwontimeout = true」,當超時超時而不是忽略寫入時,會出現錯誤。

+0

您是否嘗試移除鎖以查看它是否有效? – 2010-10-07 14:33:12

2

如果這是在CFC,你寫

<cfset var myNum=0> 

在同一方法中的一些問題?

1

上面的代碼沒有給出太多的上下文,但是您是否從您正在編寫它的相同應用程序範圍讀取會話?