I was not referring to 'var'ing, I was referring to 'scoping'. When you create a scope inside of the function, that scope only has value within that function.
You will want to upgrade the ' GetRecordFromRecordID' to also use scoping as well. William -----Original Message----- From: Tavs Dalaa [mailto:[email protected]] Sent: Saturday, October 15, 2011 9:00 AM To: cf-talk Subject: Re: Amazingly annoying concurrent CFC variable issue Makes no difference. As mentioned, I've already tried var'ing within the functions. Tavs >Inside your methods (<cffunction>) use scoping. > >For example. > <cffunction name="DoSomeAction" output="no" returntype="any"> > <cfargument name="RecordID" required="yes" type="numeric"> > <cfset var local = StructNew() /> > > <cfset local.GetRecord = >Application.Functions.GetRecordFromRecordID(arguments.RecordID)> > > <!--- HERE IS THE PROBLEM: arguments.RecordID doesn't always >match GetRecord.RecordID ---> > > <cfreturn local.Whatever> > </cffunction> >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:348187 Subscription: http://www.houseoffusion.com/groups/cf-talk/subscribe.cfm Unsubscribe: http://www.houseoffusion.com/groups/cf-talk/unsubscribe.cfm

