I avoided this thread because I wanted to see some code first. It sounded
like the original poster wanted to use globals in a non-thread safe way.

Statics are not a bad thing, but using globals to pass state around that is
only useful in local scope is very, very bad.

On Fri, Jul 30, 2010 at 7:11 AM, Jeff Schwartz <jefftschwa...@gmail.com>wrote:

> Hi Stephen,
>
> I hope I wasn't perceived as someone trying to be right. I was only trying
> to prevent other readers from being misinformed.
>
> Modern programming languages offer a lot of useful 'tools' that empower the
> kinds of programming constructs that at one time were only dreamed of. It
> would be wasteful if one didn't take advantage of them.
>
> Jeff
>
>
> On Thu, Jul 29, 2010 at 10:55 PM, Stephen Johnson 
> <onepagewo...@gmail.com>wrote:
>
>> Yes Jeff, you are correct, constant values are safe to use.
>>
>> On Jul 29, 7:23 pm, Jeff Schwartz <jefftschwa...@gmail.com> wrote:
>> > Stephen
>> >
>> > With all due respect, you are stating the obvious and the use case you
>> > present is like a text book example of last in first out/race ahead
>> > condition. Perhaps if the coder had declared the static variable final
>> and
>> > initialized it in a static constructor it would have prevented multiple
>> > assignments - assuming a single class loader of course and a single
>> class
>> > cache.
>> >
>> > Not that your point isn't valid. One does have to take care when using
>> any
>> > language feature, Java or any language for that matter. That is obvious
>> I
>> > hope.
>> >
>> > In any case I wouldn't advise anyone from avoiding using static class
>> fields
>> > if it fits their use case. With care they can and are used without any
>> > problems.
>> >
>> > Jeff
>> >
>> > On Thu, Jul 29, 2010 at 9:02 PM, Stephen Johnson <
>> onepagewo...@gmail.com>wrote:
>> >
>> >
>> >
>> >
>> >
>> > > Hi Jeff (and possible Bill if you're using Java and not Python (not
>> > > sure from the question since I don't know Python))
>> > > (Assuming Java) Using static variables could cause all kinds of
>> > > trouble if proper care is not taken to limit their accessibility since
>> > > they are shared and all requests that are being handled by that
>> > > particular JVM instance be accessing the same data. That data would be
>> > > accessible for simultaneous requests and would also survive after the
>> > > requests have finished processing and would be available to the next
>> > > request(s). This data would exist until GAE shutdown that particular
>> > > app instance on that JVM (or restarted due to a deployment, etc.)
>> > > Other JVM instances of the app would have different values.
>> >
>> > > So, for example, if we have:
>> >
>> > > public class Beta {
>> > >   public int x;
>> > > }
>> >
>> > > public class Alpha {
>> > >  public static Beta beta;
>> > > }
>> >
>> > > So if Servlet #1 receives a request and does:
>> >
>> > >  Beta b = new Beta();
>> > >  b.x = 5;
>> > >  Alpha.beta.x = b;
>> >
>> > > And then Servlet #2 receives a request and does:
>> > >  Beta b = new Beta();
>> > >  b.x = 17;
>> > >  Alpha.beta.x = b;
>> >
>> > > And then Servlet #1 continues processing:
>> > >   b.x = b.x + 5;
>> > >   ***  Oops! b.x is now 17, not 5 ***
>> >
>> > > Also, this Beta object will exist even after the requests have all
>> > > finished since the static instance will stick around. Note, that this
>> > > occurs even though these objects are not Serializable.
>> >
>> > > So, Jeff in response to:
>> > > > If storing values in class static fields were problematic I'd guess
>> that
>> > > > this would break quite a number of web apps. What do you think?
>> > > Well, static variables are by their very nature are supposed to be
>> > > shared and are not a problem if used correctly and for that purpose,
>> > > but in Bill's case he would be attempting to use a shared variable as
>> > > if it were a private variable accessible only to a particular request
>> > > and so would be used incorrectly and could cause problems for his web
>> > > app.
>> >
>> > > Okay, so static variables may not be ok. What about storing the data
>> > > in an instance variable of the Servlet?? Well, that wouldn't work
>> > > either since the servlet container only creates one instance of each
>> > > servlet class, thus the instance variables of the servlet classes act
>> > > almost like static variables, that is, they are shared amongst all
>> > > requests to that servlet and would survive even after the requests
>> > > have finished processing since the servlet container will keep the
>> > > servlet instances alive until the servlet container shuts down.
>> >
>> > > So, if Bill is using Java, then what should he do. Well,
>> > > 1.) I'm not sure why you have to re-sync the object A that is passed
>> > > in the constructors of the other objects with the handler's object A.
>> > > In Java, these would be the same object unless you are making some
>> > > sort of clone (or copy). So, I think your approach works. At least for
>> > > Java. Unless you've left some detail out.
>> > > 2.) So what you can do is you can use the ThreadLocal class to store
>> > > object A. The ThreadLocal class acts like a Map but the values are
>> > > specific to each thread and other threads don't see each other's
>> > > values. So, at the beginning of the request you can store object A
>> > > into the ThreadLocal object and then objects B, C, D, etc. can access
>> > > that object by key. One caveat is that these values would be available
>> > > to the next request that is handled by that thread so you'd need to
>> > > make sure you clear these values at either the ending or beginning of
>> > > each request.
>> >
>> > > Stephen
>> >
>> > > On Jul 29, 5:40 am, Jeff Schwartz <jefftschwa...@gmail.com> wrote:
>> > > > Hi Tim.
>> >
>> > > > Help me out here 'cause I don't understand what problem you see with
>> > > storing
>> > > > a value in a static field?
>> >
>> > > > As far as I know (and I am limiting my discussion here to Java and
>> > > servlets)
>> > > > objects are not persisted across http requests unless they are
>> > > serializable
>> > > > and stored in session or in memcache and that takes programming
>> effort
>> > > > meaning you have to deliberately program the behavior.
>> >
>> > > > Yes there are statefull web frameworks such as Wicket and JSF for
>> > > instance
>> > > > that will persist objects accross requests without programming
>> effort but
>> > > > even these are limited to model and view class instances for the
>> most
>> > > part.
>> >
>> > > > As for classes (not instances) persisting across requests (and
>> > > eliminating
>> > > > those classes that are servlet and other server pluming classes)
>> what
>> > > > classes are persisted across requests?
>> >
>> > > > If storing values in class static fields were problematic I'd guess
>> that
>> > > > this would break quite a number of web apps. What do you think?
>> >
>> > > > Jeff
>> >
>> > > > On Thu, Jul 29, 2010 at 7:31 AM, Tim Hoffman <zutes...@gmail.com>
>> wrote:
>> > > > > The biggest problem I see with storing the value at a class/module
>> > > > > level
>> > > > > is you really need to make sure you clean up after yourself,
>> otherwise
>> > > > > the
>> > > > > value may still be set when the next request is processed and that
>> > > > > value may not be
>> > > > > appropriate.
>> >
>> > > > > I would personally always grab/cache values in request object,
>> > > > > memcache, and or session
>> > > > > as appropriate.
>> >
>> > > > > That way there is no danger of exposing data to other requests.
>> >
>> > > > > But hey, if you want to use module level caches go for it.
>> >
>> > > > > I have been running appengine projects ever since it was released
>> and
>> > > > > started out with some
>> > > > > module level cache, and regretted it ever since.  It was has
>> proven to
>> > > > > be difficult ensure the cache
>> > > > > has been cleaned up, where as memcahce you can control out of
>> > > > > process.  (You can't shut an instance down
>> > > > > if it has an error and you can't remove a value from a module
>> cache)
>> >
>> > > > > Rgds
>> >
>> > > > > T
>> >
>> > > > > On Jul 29, 4:19 pm, Bill Edwards <twmaf...@gmail.com> wrote:
>> > > > > > Hey guys,
>> >
>> > > > > > Is it horrible to use global variables?  I am currently
>> executing a
>> > > > > > query at the beginning of my handler and storing the query
>> result
>> > > > > > within class object A.  I subsequently need to access the query
>> > > result
>> > > > > > within multiple different class objects, say B, C, and D.  It
>> has
>> > > been
>> > > > > > recommended to me to cache object A in the request object, but i
>> need
>> > > > > > to access the variable from within various class objects, so I'm
>> > > > > > finding that I have to pass the object A in to the constructor
>> for
>> > > > > > every new object i define, and then sync any changed state of
>> object
>> > > A
>> > > > > > with the handler's version of object A when the various class
>> object
>> > > > > > functions are completed.
>> >
>> > > > > > So it really seems like the simplest way to do things is to just
>> > > > > > define a global variable.  Is there a better option?  Can I
>> think I
>> > > > > > would ideally want to create something liek a session object to
>> store
>> > > > > > the global object.
>> >
>> > > > > > Thanks!
>> > > > > > Bill
>> >
>> > > > > --
>> > > > > You received this message because you are subscribed to the Google
>> > > Groups
>> > > > > "Google App Engine" group.
>> > > > > To post to this group, send email to
>> google-appengine@googlegroups.com
>> > > .
>> > > > > To unsubscribe from this group, send email to
>> > > > > google-appengine+unsubscr...@googlegroups.com<google-appengine%2bunsubscr...@googlegroups.com><google-appengine%2Bunsubscrib
>> e...@googlegroups.com><google-appengine%2Bunsubscrib
>> > > e...@googlegroups.com>
>> > > > > .
>> > > > > For more options, visit this group at
>> > > > >http://groups.google.com/group/google-appengine?hl=en.
>> >
>> > > > --
>> > > > --
>> > > > Jeff
>> >
>> > > --
>> > > You received this message because you are subscribed to the Google
>> Groups
>> > > "Google App Engine" group.
>> > > To post to this group, send email to
>> google-appeng...@googlegroups.com.
>> > > To unsubscribe from this group, send email to
>> > > google-appengine+unsubscr...@googlegroups.com<google-appengine%2bunsubscr...@googlegroups.com><google-appengine%2Bunsubscrib
>> e...@googlegroups.com>
>> > > .
>> > > For more options, visit this group at
>> > >http://groups.google.com/group/google-appengine?hl=en.
>> >
>> > --
>> > --
>> > Jeff
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Google App Engine" group.
>> To post to this group, send email to google-appeng...@googlegroups.com.
>> To unsubscribe from this group, send email to
>> google-appengine+unsubscr...@googlegroups.com<google-appengine%2bunsubscr...@googlegroups.com>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/google-appengine?hl=en.
>>
>>
>
>
> --
> --
> Jeff
>
> --
> You received this message because you are subscribed to the Google Groups
> "Google App Engine" group.
> To post to this group, send email to google-appeng...@googlegroups.com.
> To unsubscribe from this group, send email to
> google-appengine+unsubscr...@googlegroups.com<google-appengine%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-appengine?hl=en.
>



-- 
Ikai Lan
Developer Programs Engineer, Google App Engine
Blog: http://googleappengine.blogspot.com
Twitter: http://twitter.com/app_engine
Reddit: http://www.reddit.com/r/appengine

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to google-appeng...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.

Reply via email to