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