I've got some pretty simple CFC code which fails when executed with 10+
concurrent connections. Variables between requests get mixed up, so one request
with recordID 10 suddenly returns with recordID 2 etc, causing issues in the
application.
This is simplified version of code:
application.cfm
<cfapplication name="OurApp" applicationtimeout="#CreateTimeSpan(0,1,0,0)#">
<cfset Application.functions =
createObject("component","com.ourapp.functions").init() />
functions.cfc
<cfcomponent displayname="Our functions">
<cffunction name="init" output="false" returntype="any" access="public">
<cfreturn this />
</cffunction>
<cffunction name="DoSomeAction" output="no" returntype="any">
<cfargument name="RecordID" required="yes" type="numeric">
<cfset GetRecord =
Application.Functions.GetRecordFromRecordID(arguments.RecordID)>
<!--- HERE IS THE PROBLEM: arguments.RecordID doesn't always
match GetRecord.RecordID --->
<cfreturn Whatever>
</cffunction>
<cffunction name="GetRecordFromRecordID" output="no" returntype="any">
<cfargument name="RecordID" required="yes" type="numeric">
<cfquery name="GetRecord"
datasource="#Application.AppDatasource#">
SELECT RecordID,RecordTitle FROM Records
WHERE RecordID = <cfqueryparam
value="#arguments.RecordID#" cfsqltype="CF_SQL_NUMERIC">
</cfquery>
<cfreturn GetRecord>
</cffunction>
</cfcomponent>
index.cfm
<cfset ActionResult = Application.Functions.DoSomeAction(URL.RecordID)>
Now, pretty simple, and tons of irrelevant code removed.
If we fire 50 requests at the same moment to index.cfm, like:
index.cfm?RecordID=1
index.cfm?RecordID=2
..
..
.. Then within the DoSomeAction function, we see that 1 out of 25 requests on
average there's a mixup, we get a result for a different record than the one we
requested.
Tried to wrap in CFLOCK, eg:
<cflock name="Lockname" timeout="15" type="exclusive">
<cfset GetRecord =
Application.Functions.GetRecordFromRecordID(arguments.RecordID)>
</cflock>
.. no diff.
Tried to Var and cflock, ie:
<cflock name="Lockname" timeout="15" type="exclusive">
<cfset Var GetRecord =
Application.Functions.GetRecordFromRecordID(arguments.RecordID)>
</cflock>
Any ideas?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Order the Adobe Coldfusion Anthology now!
http://www.amazon.com/Adobe-Coldfusion-Anthology/dp/1430272155/?tag=houseoffusion
Archive:
http://www.houseoffusion.com/groups/cf-talk/message.cfm/messageid:348183
Subscription: http://www.houseoffusion.com/groups/cf-talk/subscribe.cfm
Unsubscribe: http://www.houseoffusion.com/groups/cf-talk/unsubscribe.cfm