Hello All,

I am using datasource as a JNDI resource described in
http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html 
The problem I see is that datasource is not closed cleanly when the server
shuts down.
I looked into the code and I can only see that it destroys the Resource and
other references. But destroys or close the datasource on a whole.

I even tried to see by implementing javax.management.MBeanRegistration
interface and found that event for before and after registration is called
but I do not find anything which un registers my datasource object.

In the threads discussed in below links, I found that tomcat do not closes
the datasource and it has to be closed on our own.
http://www.nabble.com/Right-way-to-close-database-connection-pool-td24832197
.html 

http://www.nabble.com/JNDI-datasource-failing-td4639851.html 
In my case, I use the datasource for the server instead for a specific web
app.
I had to close it with a help of a listener after the server stops.

My Questions/problems are:
When tomcat takes care of creating maintaining datasource, then does it not
closes it when server is shut down?
Do we have to close it on our own (the way I do) or is there any better way
to do it without external listener?

Below are my configurations:

Server version: Apache Tomcat/5.5.20
Server built:   Sep 12 2006 10:09:20
Server number:  5.5.20.0
OS Name:        Windows XP
OS Version:     5.1
Architecture:   x86
JVM Version:    1.5.0_08-b03
JVM Vendor:     Sun Microsystems Inc.

In server.xml

<Server>
  <Listener className="com.xyz.foo.ServerLifecycleListenerImpl"
dsName="jdbc/myDB"/>
  <GlobalNamingResources>

        <Resource auth="Container" 
                description="xyz Connection pool" 
                name="jdbc/myDB" 
                type="javax.sql.DataSource"
                factory="com.xyz.foo.DataSourceFactory"
                propertiesFile="db.properties" />
  </GlobalNamingResources>
        ...
        ...
</server>

In web.xml

        <resource-ref>
                <description>Resource references to database connection pool
configured in server.xml</description>
                <res-ref-name>jdbc/myDB</res-ref-name>
                <res-type>javax.sql.DataSource</res-type>
                <res-auth>Container</res-auth>
        </resource-ref>

Listener:
public class ServerLifecycleListenerImpl implements
org.apache.catalina.LifecycleListener{

        private String dsName;

        public void lifecycleEvent(LifecycleEvent event) {
                if (Lifecycle.AFTER_STOP_EVENT.equals(event.getType())) {
                        Object source = event.getSource();
                        if (source instanceof StandardServer) {
                        StandardServer server = (StandardServer)source;
                        javax.naming.Context globalNamingContext =
server.getGlobalNamingContext();
                                try {
                                        Object ds =
globalNamingContext.lookup(dsName);
                                        if (ds instanceof BasicDataSource)
                                                ((BasicDataSource)
ds).close();
                                        else {
                                                throw new
SQLException("Cannot find Datasource");
                                        }
                
                                } catch (NamingException e) {
                                        //Logging code
                                } catch (SQLException e) {
                                        //Logging code
                                }
                        }
                }

        public void setDsName(String dsName) {
                this.dsName = dsName;
        }
}



--
Thanks,
Mohammed Bin Mahmood.



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

Reply via email to