I think your problem is scoping.
e.g. you have

 <cfset GetRecord =
Application.Functions.GetRecordFromRecordID(arguments.RecordID)>

so this variable could get overwritten by other code as it is in the
variables scope.

If you are on the latest version of CF9 then you can use the new local
scope to avoid this

 <cfset local.GetRecord =
Application.Functions.GetRecordFromRecordID(arguments.RecordID)>

If you are on an older version of CF then you can create the local
scope yourself

<cfset var local = StructNew()>

you should scope all your variablesvin CFC's this way to avoid problems.

give that a go



On Sat, Oct 15, 2011 at 4:46 PM, Tavs Dalaa <[email protected]> wrote:
>
> 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:348186
Subscription: http://www.houseoffusion.com/groups/cf-talk/subscribe.cfm
Unsubscribe: http://www.houseoffusion.com/groups/cf-talk/unsubscribe.cfm

Reply via email to