2010-10-05 91 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

上面的代码没有给出太多的上下文,但是您是否从您正在编写它的相同应用程序范围读取会话?