Having just gone through this headache last week, I can provide a
solution that works for me (for TC5 only!).

First, create a file called context.xml and put it in a directory called
"META-INF" at the same level in your source hierarchy as WEB-INF.
context.xml should contain your <Context> and <Resource> definitions,
something like:

<Context path="/proto" docBase="proto.war" override="true"
cachingAllowed="true" useNaming="true" reloadable="false" debug="0">
    
<Resource name="jdbc/protodb" auth="Container" 
type="javax.sql.DataSource" />
<ResourceParams name="jdbc/protodb">

...

Second, make sure your web.xml file contains the necessary
<resource-ref> details:

<resource-ref>
    <res-ref-name>jdbc/protodb</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

Third, use the Tomcat Ant tasks to undeploy/deploy your WAR to the
appbase directory:

<undeploy path="/${app.name}" url="${manager.url}"
 username="${manager.username}" password="${manager.password}" />

<deploy url="${manager.url}" username="${manager.username}"
 password="${manager.password}" path="/${app.name}"
 war="file:///${dist.home}/${app.name}.war" />

Note that I also have "unpackWARs" set to "false" in server.xml, so that
the WAR is left intact.  

I noticed that when using this setup, Tomcat pulls context.xml out of
the WAR, renames it <app name>.war, and puts it into the
"%CATALINA_HOME%/conf/Catalina/localhost" directory.  I just it alone,
as it goes away on undeploy.

Let me know if this doesn't work for you.

Jay

-----Original Message-----
From: todd runstein [mailto:[EMAIL PROTECTED] 
Sent: Thursday, February 05, 2004 4:51 PM
To: [EMAIL PROTECTED]
Subject: JNDI datasource lost on redeploy

I've set up a JNDI datasource on my test server that
works just fine (Tomcat=5.0.18, JDK=1.4.1, RedHat=8,
M$_SQL=2000).  However, each time I recompile and
redeploy the application, I lose my connection pool,
recieving the "Cannot create JDBC driver of class ''
for connect URL 'null'" error.  I have to restart
Tomcat to get it working again.

This sort of makes sense, since I'm defining the
Resource within a Context in server.xml.  It seems
that I either need to make the resource globally
available to every web app, or move the resource
definition to within my web app.  Unfortunately, I
don't know what to move or where to move it or what
options might work.  Any advice or suggestions?

I'm including all the code used to get the connection
as it stands now.  Again, this currently works up
until I try to redeploy the web app.

My driver jars (there are 3 for MS SQL) are in
$CATALINA_HOME/common/lib

server.xml:
          <Context path="/mfgreports"
docBase="mfgreports" debug="5">
              <Resource
name="datasource.testtrk.circuits"
                auth="Container"
                type="javax.sql.DataSource" />
              <ResourceParams
name="datasource.testtrk.circuits">
                <parameter>
                        <name>factory</name>
                       
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
                </parameter>
                .....
                <parameter>
                        <name>driverClassName</name>
                       
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
                </parameter>
                <parameter>
                        <name>url</name>
                       
<value>jdbc:microsoft:sqlserver://testtrk:1433;databasename=Circuits</va
lue>
                </parameter>

              </ResourceParams>
          </Context>


web.xml:
        <resource-ref>  
        
<res-ref-name>datasource.testtrk.circuits</res-ref-name>
                <res-type>javax.sql.DataSource</res-type>
                <res-auth>Container</res-auth>
        </resource-ref>


Code used to get connection:
public class JNDIConnection {

        public static Connection getConnection(String
datasource) 
                throws NamingException, SQLException{
                        Context ctx = new InitialContext();
//This syntax is a bit different than the docs show,
but it appears to be working
                        DataSource ds =
(DataSource)ctx.lookup("java:comp/env/"+datasource); 
                        return ds.getConnection();
        }
}

Thanks again!

=====
The only "dumb question" is the one you were too afraid to ask.
________________________________________

Check out RouteRuler - Free software for runners, cyclists, walkers,
etc.
http://routeruler.sourceforge.net
________________________________________

__________________________________
Do you Yahoo!?
Yahoo! Finance: Get your refund fast by filing online.
http://taxes.yahoo.com/filing.html

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to