On Mon, 2002-12-23 at 11:52, Felipe Schnack wrote:
>  My application have two types of objects that are constantly created
> and destroyed. I believe that they could be pooled in some way (maybe
> using commons pooling package. These types are:
>  1- Objects that handle user interaction. Basically they are the objects
> that actually implement tasks that would be otherwise done using
> servlets. In pratice, JSPs send data to them (like html form data) and
> they process it and return the results to the browser. These ones i'm
> not sure (yet) if I should pool. I'm not familiar with Struts, I would
> like to know how it does that. Someone can give me some tips?
>  2- These I strongly believe I should cache, and I'm already caching
> them, but with an solution designed by myself. I have some database
> tables that stores user permissions for the application. Basically,
> there are two tables that stores an module ID and who can access it (by
> user id, user profession, etc). I was thinking about loading all of them
> in memory at system startup and update them from time to time (or using
> Observable interfaces)? 

I don't fully understand how your application is structured, but here
are my general thoughts on pooling and caching of objects.

Way back in Java 1.0, creating objects was expensive, so people had the
idea of having pools of pre-created objects ready to go, which could be
reinitialized with new data.  Reinitializing an object was a big
performance win over constructing a new object.  Times have changed
since then.  For ordinary objects, creating new objects from scratch is
very very fast.  I read somewhere that an ordinary PII machine can
create something like a million small ordinary objects per second, and
can GC them at the same rate.  There is absolutely no reason to pool
these types of objects.  There are, however, objects which are still
expensive to create and should be pooled.  The obvious examples are
database connections, threads, and possibly (possibly) direct buffers. 
But outside of those areas, don't pool objects.

One big reason to not pool objects is for correctness and security.  If
you are using pooled objects, you have to do lots of checking at every
step to see if the object is properly initialized, and to make sure it
contains no left-over data.  What if the object represents a user
session, and somehow users were able to get into other users' sessions
because an old object got reused without proper reinitialization?  That
could be a big problem.  We moved from C++ to Java to avoid having to
worry about storage management bugs like that.

It is best to make objects immutable.  This means that after the object
is constructed, no externally visible changes to the object can ever
occur for the lifetime of the object.  Immutable objects are much safer
and more correct.  This may be counter-intuitive, but immutable objects
can also lead to better program performance because their internal data
structure can be shared.  This also helps on debugging.  The object is
in a valid state AT ALL TIMES in its existence.  Making all the instance
members of an object private final really helps catch a lot of bugs at
compile time.

Caching, on the other hand, is a totally different.  Caching objects is
definitely a good way to go, especially in web applications where
objects often have to be used several times in one page output, and they
often come from some kind of "expensive" persistent storage like a db. 
Go ahead and cache.  Put your cache in the servelt context, for
instance.  Again, make the objects in your cache immutable if possible. 
This has many advantages, including correctness, performance and thread
safety.



--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to