在Windows2003 / IIS6上运行ColdFusion 8.01标准
的Application.cfc:
<cfcomponent output="false">
<cfscript>
THIS.SessionManagement = "Yes";
THIS.SessionTimeout = CreateTimeSpan(0, 3, 0, 0);
THIS.ApplicationTimeout = CreateTimeSpan(0, 8, 0, 0);
</cfscript>
<cffunction name="onRequestStart" returnType="Boolean" output="false">
<cfargument name="targetPage" type="string" required="true">
<cfscript>
if (!StructKeyExists(SESSION, "User"))
SESSION.User = CreateObject("component", "cfc.User");
</cfscript>
</cffunction>
</cfcomponent>
模板文件伪代码示例:
LOCAL.qItems =
CreateObject(
"component",
"cfc.Items"
).setUser(SESSION.User).getItems();
for (i=1; i<=LOCAL.qItems.RECORDCOUNT; i++) {
LOCAL.Item =
CreateObject(
"component",
"cfc.Item"
).setUser(
SESSION.User
).setId(LOCAL.qItems["Sku"][i]);
}
在onRequestStart()
的{{1}}中设置了SESSION.User(如果尚未定义)。上面的代码在模板文件中运行。对Application.cfc
的第二次引用引发了消息SESSION.User
的异常。
为什么SESSION.User会被定义(不抛出异常)前几行,然后在几行之后(几毫秒内)抛出此异常?
在整个申请过程中,这可能每天在不同的模板中发生一次。
我该如何防止这种情况?
答案 0 :(得分:7)
这很可能是一个线程安全问题,代码中的其他内容会清除会话范围或为SESSION.User
分配NULL。
我建议你因为你的循环中似乎没有i
的本地声明,所以代码不是线程安全的 - 所以你的代码中的其他地方可能会有类似的错误。
答案 1 :(得分:1)
我把这行放在“SESSION.User = CreateObject(”component“,”cfc.User“);”进入onSessionStart()然后它将在首次启动每个用户会话时运行。