Hi Bo. :-)  I'll take a SWAG at this one.

>- a similar question is: with Servlet spec 2.2+,  how to do
>  the following:
>  container uses a ClassLoader to load myServlet,
>  then I modify myServlet and re-compile it, and after a while,
>  the container finds the new version of myServlet  and try to
>  reload it. now I if I follow spec 2.2+ and don't  make another
>  ClassLoader to reload myServlet->I use the same ClassLoader
>  to reload  myServlet, now my questions: how to "force" this
>  ClassLoader to unload the old version of myServlet, and reload
>  the new version of myServlet ?

>From the spec, section 2.3.3.2:

"If permanent unavailabilty is indicated by the UnavailableException,
the servlet container must remove the servlet from service, call its
destroy method, and release the servlet instance."

So, maybe you could add a little method in your servlet whose main job
is to throw this exception.  This method could be called with a link on
your web page that only you could see.  After you hit the link, you could
copy the new version of your servlet into your servlets directory.
Doesn't seem like the best way to do it, but maybe it would work.

Also, I'm not sure if this would all be done by the same ClassLoader or not.
Does it matter which ClassLoader loads a servlet?

Thanks for your response to my previous e-mail.  I've just started
learning about servlets, and I must say its making my head hurt.

Thanks,
Craig Sullivan



-----Original Message-----
From: Bo Xu [mailto:[EMAIL PROTECTED]]
Sent: Thursday, January 25, 2001 9:34 AM
To: [EMAIL PROTECTED]
Subject: Re: singleton vs all-static class


"Sullivan, Craig R." wrote:

> [...]
> We're running JServ on a single server.  Won't all
> of our servlets get loaded by a single classloader?
> Additionally, if I move the helper classes outside
> of the servlets directory, they should all get loaded
> by a single classloader, also, right?     [...]

Hi :-)  I also have 2 similar questions:
          - how to load  helper class by the same ClassLoader?
          - how to force/prevent a ClassLoader to reload helper class ?


* from several emails in Servlet-List:
   if you move the helper classes outside of the servlets
  directory, and put them into CLASSPATH, it will "force"
  these helper classes loaded by SystemClassLoader,
  I guess now we can be sure that : all such helper classes
  will be loaded by the same ClassLoader(SystemClassLoader).

*
 -  from Servlet spec2.2-4.6 and spec2.3-3.6:
   ...
  Reloading Considerations
  Many servlet containers support servlet reloading for ease of development.
Reloading of servlet
  classes has been accomplished by previous generations of servlet
containers
by creating a new class
  loader to load the servlet which is distinct from class loaders used to
load
other servlets or the
  classes that they use in the servlet context. This can have the
undesirable
side effect of causing
  object references within a servlet context to point at a different class
or
object than expected which
  can cause unexpected behavior.
  Therefore, when a Container Provider implements a class reloading scheme
for
ease of
  development, they must ensure that all servlets, and classes that they may
use, are loaded in the
  scope of a single class loader guaranteeing that the application will
behave
as expected by the
  Developer.
  ...

  so IMO, the above means even if we put helper class inside
  of servlets directory, with spec2.2+, we still can be sure that
  all helper calsses will be loaded by the same ClassLoader(
  a custom ClassLoader used by Servlet container)


* if we move the helper classes outside of the servlets
  directory, and put them into Java_HOME/jre/lib/ext, it will
   "force" these helper classes loaded by ExtClassLoader.


* if we move the helper classes Inside of the servlets
  directory, and Also put them into CLASSPATH or
   Java_HOME/jre/lib/ext , I don't know which
   ClassLoader will load them, I just   guess:
     - if container does Not use "3 parameters Class.forName(...),
       I guess helper classes will be loaded by SystemClassLoader
       or ExtClassLoader
     - if container uses "3 parameters Class.forName(...),
       I guess helper classes will be loaded by custom ClassLoader


[*]  so from the above, I guess we can be sure that we can let helper
      classes loaded by the same ClassLoader.


* my question is:
      0  how to force/prevent reloading helper class ?

    - if helper classes are loaded by the only-one ClassLoader, but if
      at one moment(I suppose) , all the instances of myServlet
      class have been destroyed, and mySevlvet class has been
      unloaded,  now "all the possible refrences" to helper class
      within myServlet class have been lost,  so even if now
      the ClassLoader still hold a reference to a Class-object of
      helper classes, is it possible that the ClassLoader will
      "destroy" this Class-object?  and after ClassLoader
      "destroys" this Class-object, the static reference to
      the onlyOneInstance of helper classes(if helper class is also
      a SingleTon) will also be lost, and so this onlyOneInstance
      of helper classes will be destroyed.

   - if the above is right, now at this moment, all the reference to
     helper class are not there(and so the reference to the
     onlyOneInstance of helper class is also not there),
     so now is it possible that ClassLoader will "destroy"
     the Class-object to helper class? if so, and if I want,
     how can I prevent it?   because if I want to avoid
     open/reopen the DB connections many times, I don't
     want load/reload helper classes many times.

   - from several emails, if I put a reference to helper
      classes into "ServletContext", can I be sure that
      helper classes will not be unloaded? several emails
      give me this directions, I just want to make sure about
      it.

     - a similar question is: with Servlet spec 2.2+,  how to do
        the following:
       container uses a ClassLoader to load myServlet,
       then I modify myServlet and re-compile it, and after a while,
       the container finds the new version of myServlet  and try to
       reload it. now I if I follow spec 2.2+ and don't  make another
       ClassLoader to reload myServlet->I use the same ClassLoader
       to reload  myServlet, now my questions: how to "force" this
       ClassLoader to unload the old version of myServlet, and reload
       the new version of myServlet ?


Thanks in advance! :-)

Bo
Jan.25, 2001

___________________________________________________________________________
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff SERVLET-INTEREST".

Archives: http://archives.java.sun.com/archives/servlet-interest.html
Resources: http://java.sun.com/products/servlet/external-resources.html
LISTSERV Help: http://www.lsoft.com/manuals/user/user.html

___________________________________________________________________________
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff SERVLET-INTEREST".

Archives: http://archives.java.sun.com/archives/servlet-interest.html
Resources: http://java.sun.com/products/servlet/external-resources.html
LISTSERV Help: http://www.lsoft.com/manuals/user/user.html

Reply via email to