Thanks for your replies. I agree that Tomcat should be responsible for
all objects that are configured in Tomcat, and the web app should be
responsible for objects that are created by the webapp. Currently it
does not happen properly in tomcat. This is not related to DBCP code,
it is all Tomcat code.

In terms of listeners, I saw that Tomcat executes requests while in
the closing process. This may mean that after the context listener
closed the pool, a new request will cause it to initialize again. We
had a similar problem of things being created after shutdown started,
and there are many permutations of listeners and sequences to test.
Lots of debugging to do here. This again is irrespective of the
listener which I am sure is closing the connection pool, it is a
tomcat lifecycle issue.

> It is built into Tomcat. Just read the docs for JDBC DataSources:
> http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html

I am talking about something else. Basically the XML is short:

<GlobalNamingResources>
        <Resource auth="Container"
        ....
        type="javax.sql.DataSource"
        propertiesFile="database_pool_configuration_file.properties" />
</GlobalNamingResources>

No configuration in XML other than JNDI related bindings.

> My understanding was that:
>
> 1. Tomcat does not remove the connection pool
> 2. Once the shutdown process has started, no new requests will be
> handled by the currently-shutting-down context
>
> Could these two items give the result you are observing? It's easy
> enough to have your webapp close the DataSource (even though it's kinda
> stupid that Tomcat doesn't do it for you).

That depends on which shutdown it is. Understanding 2 is not correct
from my debugging. You can have a sequence of:
1. Connection pool closed
2. Request sent to servlet

This happens during tomcat shutdown and will trigger a new connection.
I suspect that similar sequence exists during redeploy. I cant recall
exactly what happened in this case, but I remember that it was in more
than one scenario. We decided to shut down tomcat every time and
forget about it, even though we do have a listener that closes pools,
along the same lines as the listener that you wrote I imagine.

If you want to add a listener that closes the pool, I would try adding
tomcat lifecycle listener to the context. You can handle event
Lifecycle.AFTER_STOP_EVENT. Try both listeners (web app and tomcat)
and see which one runs last, and put the code there. You have higher
probability of catching an open connection if you do it later. If the
listener is configured via tomcat and not the web app, you also get a
configuration that each party is responsible for cleaning up its own
bugs, as opposed to web app cleaning up tomcat bugs. Then the vision
of J2EE designers of "separation of roles" materializes :)

Elli

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

Reply via email to