我发生了一件非常奇怪的事情,似乎无法追踪它。我有一个简单形式的简单CFM,用户按下提交按钮,页面POST到自身,然后调用带有<cfinvoke>
的CFC函数。正在调用的函数对Oracle进行一次<cfstoredproc>
调用。该Oracle程序应该创建大约3,000多条记录。但它创造了这个数量的两倍。我在<cflog>
调用之前放置了<cfstoredproc>
,并且创建了2个条目。所以这个功能不知怎的第二次被解雇了。相同的用户,相同的SessionID,不同的ThreadID。我不知道这第二个电话来自哪里。
我在<cflock>
电话周围放了<cfstoredproc>
并解决了问题,现在只创建了3000多个补丁。但是现在我得到了这次神秘的第二次电话的锁定超时错误。
另一个奇怪的事情是<cflock>
超时为30秒。但是<cflog>
最初只显示1个条目,然后恰好60秒后出现第二个日志条目并发生<cflock>
错误。我将<cflock>
超时降低到15秒,结果仍然相同。为什么这第二个神秘的电话每次都在第一个之后正好记录1分钟?
我正在运行ColdFusion 10,0,13,287689。
"Severity","ThreadID","Date","Time","Application","Message"
"Information","ajp-bio-8012-exec-9","06/26/14","14:59:34",,"D:\ColdFusion10\cfusion\logs\cbruserwo_cfc.log initialized"
"Information","ajp-bio-8012-exec-9","06/26/14","14:59:34","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054"
"Information","ajp-bio-8012-exec-7","06/26/14","15:00:35","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054" <-- the mysterious one, comes in 1 minute later
"Information","ajp-bio-8012-exec-12","06/26/14","15:08:36","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054"
"Information","ajp-bio-8012-exec-5","06/26/14","15:09:37","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054" <-- the mysterious one, comes in 1 minute later
"Information","ajp-bio-8012-exec-1","06/26/14","15:19:54","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054"
"Information","ajp-bio-8012-exec-7","06/26/14","15:20:57","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054" <-- the mysterious one, comes in 1 minute later
我正在使用带有onRequest
和onCFCRequest
方法的Application.cfc(以及其他常用方法)。
部分代码......
<cfcomponent>
<cffunction name="create" access="public">
...removed some trivial code...
<!--- START: debug this craziness --->
<cflock timeout="30" name="A-#form.cbrorderunid#">
<cfif not isdefined("session.cbruserwo_cfc.calledcnt")>
<cfset session.cbruserwo_cfc.calledcnt = 1>
<cfelse>
<cfset session.cbruserwo_cfc.calledcnt = session.cbruserwo_cfc.calledcnt+1>
</cfif>
<cflog file="cbruserwo_cfc" text="#session.sv.un# // #session.sv.fullname# // #session.sv.csid# // lockname: B-#form.cbrorderunid#">
<cfsavecontent variable="xxx">
<cfoutput>
session.cbruserwo_cfc.calledcnt: #session.cbruserwo_cfc.calledcnt#<br>
CGI: <cfdump var="#cgi#">
FORM: <cfdump var="#form#">
URL: <cfdump var="#url#">
ARGUMENTS: <cfdump var="#arguments#">
</cfoutput>
</cfsavecontent>
<cffile action= "write" file="D:\temp\cbruserwo_cfc.html" addNewLine="no" output="#xxx#">
</cflock>
<!--- END: debug this craziness --->
<!--- The debug code above shows another POST/call/request something being made, but the network traffic shows only 1 POST happening --->
<cflock timeout="30" name="B-#form.cbrorderunid#">
<cfstoredproc>
<!---
This is the call that would do the 3000+ inserts, omitted contents, irrelavent to question.
The cflock around it fixes the duplicate records from being created, but now I get lock timeout
errors from this mysterious second request.
--->
</cfstoredproc>
</cflock>
...removed some trivial code...
</cffunction>
</cfcomponent>
UPDATE ...
有些人要求提供所有代码,有些人要求不要发布所有代码,所以我不知道你们想要的是什么。我承认这是一个奇怪的。我们最近添加了application.cfc-&gt; onRequest函数。不确定这是否与它有关。但它现在所做的只是......
<cffunction name="onRequest" access="public">
<cfargument name="TargetPage" type="string" required="true" />
<!--- Make these functions globally accessible --->
<cfset structAppend(url, createObject("component", "lib_globalfunctions"))>
<!--- Include the requested page. --->
<cfinclude template="#ARGUMENTS.TargetPage#" />
</cffunction>
我还检查了所有的Apache ssl_requestlog,只发生了一个帖子。这就是为什么我没有显示我的任何HTML,表单,按钮,提交代码的原因。
我会尝试删除所有自定义标签/专有代码,并提出一个简单的bug通用复制。如果我可以,我会重写这个问题并发布。它需要一些时间。只是想知道是否有人之前听过这样的错误,看起来没有人,谢谢。
更新更新......
它看起来越来越不像ColdFusion问题了。
每个子弹点对每个用户都是一致的。
答案 0 :(得分:0)
检查你的application.cfc / application.cfm,看看onRequest函数中是否有对POST数据的操作。
答案 1 :(得分:0)
你是否可能在Barracuda防火墙后面跑?如果是这样,它们可能会处理&#34;会话超时&#34;。我遇到了确切的问题并将其追溯到防火墙。他们的默认会话超时为60秒,之后他们向浏览器发送408超时错误,强制它发送第二个请求。
希望这有帮助。