ColdFusion - 重复的POST被解雇

时间:2014-06-26 20:49:11

标签: oracle coldfusion

我发生了一件非常奇怪的事情,似乎无法追踪它。我有一个简单形式的简单CFM,用户按下提交按钮,页面POST到自身,然后调用带有<cfinvoke>的CFC函数。正在调用的函数对Oracle进行一次<cfstoredproc>调用。该Oracle程序应该创建大约3,000多条记录。但它创造了这个数量的两倍。我在<cflog>调用之前放置了<cfstoredproc>,并且创建了2个条目。所以这个功能不知怎的第二次被解雇了。相同的用户,相同的SessionID,不同的ThreadID。我不知道这第二个电话来自哪里。

  • 我只按了一次按钮。
  • 我看了网络流量,我只看到一个POST。

我在<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

我正在使用带有onRequestonCFCRequest方法的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问题了。

每个子弹点对每个用户都是一致的。

  • ME - 最新版Chrome,第二个神秘请求发生。
  • 另一个用户 - 同一个建筑物,相同版本的Chrome,没有第二个请求。
  • ME - IE10,没有第二次请求。
  • 另一个用户 - 在建筑物外面,IE10发生了第二个神秘请求。

2 个答案:

答案 0 :(得分:0)

检查你的application.cfc / application.cfm,看看onRequest函数中是否有对POST数据的操作。

答案 1 :(得分:0)

你是否可能在Barracuda防火墙后面跑?如果是这样,它们可能会处理&#34;会话超时&#34;。我遇到了确切的问题并将其追溯到防火墙。他们的默认会话超时为60秒,之后他们向浏览器发送408超时错误,强制它发送第二个请求。

希望这有帮助。