Dave,
I guess I did a bit too much snipping when I put my code in the email,
but I always var scope all variables.  Next time I guess I'll just put
the full code in ;).

You said that the only time I'd need a lock would be when I've got an
instance stored in shared scope.  So considering that my user object in
this case is not stored in any shared scope, as long as I'm correctly
var'ing each query for the read / write operations, I won't have to
worry about any type of race conditions?


Rich Kroll
Application Developer

|-----Original Message-----
|From: Dave Ross [mailto:[EMAIL PROTECTED]
|Sent: Saturday, April 29, 2006 10:42 PM
|To: CF-Talk
|Subject: Re: CF, OO, & Thread Safety
|
|Ouch, no!!! where/who told you to lock like that? You are making your
|application single-threaded by doing that!
|
|You need to var-scope the name of your query. This will make your DAO's
|read thread-safe without syncronizing the calls (making it single
|threaded). The ironic thing is that the read() method you posted ISN'T
|actually thread-safe, because you didn't local var scope the "user"
|variable, thus it becomes an instance variable of the DAO and then
could be
|overwritten by another request before your method gets a chance to
return
|it. Here's an example of thread-safe code:
|
|<cffunction name="read" access="public" output="false"
returntype="user">
|       <cfargument name="userID" type="numeric" required="yes">
|
|       <cfset var readuser = 0/>
|
|       <cfquery name="readuser" datasource="#variables.dsn#">
|       -- query user
|       </cfquery>
|
|       <cfif readuser.recordcount eq 1>
|               <cfreturn createObject("component","user").init(data)>
|       <cfelse>
|               <cfreturn createObject("component", "user").init()>
|       </cfif>
|</cffunction>
|
|So, no, you don't need to lock anywhere. The only reason to use a lock
is
|when you have a CFC instance stored in a shared scope (e.g. application
|scope) and that CFC has properties (aka members aka instance data)
which
|you need to read and write after the object has been created. You'd
need to
|syncronize the access to those properties and thus you would use a
named
|lock for the writes. This usually isn't the case with shared-scope
objects
|like gateways, DAOs, services, etc because their methods don't modify
|instance data, thus you hardly ever need locking in an OO CFC app.
|
|Also, I'm not sure why your "gateway" would be calling a DAO. While
it's
|just naming, it would confuse me if I was looking at your code.
Gateways
|provide aggregated access to data (e.g., they return queries or similar
|datasets), while DAOs provide persistance methods (CRUD) for individual
|objects.
|
|Hope that helps...
|
|Dave Ross
|http://www.d-ross.org
|http://www.coldspringframework.org

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Message: http://www.houseoffusion.com/lists.cfm/link=i:4:239137
Archives: http://www.houseoffusion.com/cf_lists/threads.cfm/4
Subscription: http://www.houseoffusion.com/lists.cfm/link=s:4
Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.4
Donations & Support: http://www.houseoffusion.com/tiny.cfm/54

Reply via email to