tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Rodrigo Ruiz <rr...@gridsystems.com>
Subject Re: Singleton memory leak after redeploying.
Date Wed, 30 Nov 2005 11:44:00 GMT
Hi, I would like to add my two cents :-)

If I know that a class will only be instantiated once or twice, I 
usually prefer to declare the logger field as non-static.
I put in this category Stateless Session EJBs, servlets, filters, 
listeners, JSPs, and any singleton classes I implement by myself.

Also, on webapps, I tend to use the ServletContext as a singleton 
instance container, instead of using the singleton pattern, whenever I 
can. The performance is a bit worse, but it can be reduced by storing a 
local reference in the classes that access them, and I gain some 
benefits too: no need to manually free resources on context 
undeployment, and the ability to put those classes on the common or 
shared directory of Tomcat, and still have separate instances for each 
webapp using them.

I usually create a simple factory class like:

class XXXFactory {
  private static XXX singleton = null;
  private static Object lock = new Object();

  public static XXX getInstance(ServletContext ctx) {
    XXX instance;
    synchronized (lock) {
      if (ctx == null) {
        if (singleton == null) singleton = new XXX();
        instance = singleton;
      } else {
        instance = (XXX)ctx.getAttribute(XXX.class.getName());
        if (instance == null) {
          instance = new XXX();
          ctx.setAttribute(XXX.class.getName(), instance);
        }
      }
    }
    return instance;
  }
}

Another option is to use the commons discovery framework, but sometimes 
I just prefer a simpler solution. :-)

HTH,
Rodrigo Ruiz

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Mime
View raw message