I am having trouble connecting to MS SQL using a JNDI DataSource with Tomcat 4.1.24. Note that I have succesfully gotten this to work with Resin using the same Java classes and jsps.
Here is my server.xml, it is being managed by my host, so I have to ask them to make all changse.
<Host name="testdesigner.com" debug="0" appBase="/mount/Server12/web/public_html/BacMan/" unpackWARs="true" autoDeploy="true">
<Alias>www.testdesigner.com</Alias>
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="/mount/Server12/web/public_html/BacMan/logs" prefix="testdesigner_com_tomcat_access." suffix=".log"
pattern="common" resolveHosts="false"/>
<Logger className="org.apache.catalina.logger.FileLogger" directory="/mount/Server12/web/public_html/BacMan/logs" prefix="testdesigner_com_tomcat." suffix=".log" timestamp="true"/>
<Logger className="org.apache.catalina.logger.SystemErrLogger"
directory="/mount/Server12/web/public_html/BacMan/logs" prefix="testdesigner_com_tomcat_syserr." suffix=".log" timestamp="true"/>
<Logger className="org.apache.catalina.logger.SystemOutLogger"
directory="/mount/Server12/web/public_html/BacMan/logs" prefix="testdesigner_com_tomcat_sysout." suffix=".log"
timestamp="true"/>
<Context path="" docBase="" debug="0" reloadable="true">
<Loader className="org.apache.catalina.loader.WebappLoader"
loaderClass="org.apache.catalina.loader.WebappClassLoader" checkInterval="3"/>
<Resource name="jdbc/MSSQL_Tests" type="javax.sql.DataSource" auth="Container">
<ResourceParams name="jdbc/MSSQL_Tests">
<parameter>
<name>user</name>
<value>*user*</value>
</parameter>
<parameter>
<name>password</name>
<value>*password*</value>
</parameter>
<parameter>
<name>driverName</name>
<value>jdbc:microsoft:sqlserver://sqlserver3.loosefoot.com:1433;DatabaseName=tests;ProgramName=TestDesigner</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>
</ResourceParams>
</Resource>
</Context>
<Context path="/jakartamanager" debug="0" privileged="true" docBase="/var/tomcat4/server/webapps/manager"/>
</Host>
Here is my web.xml
<web-app>
<display-name>www.testdesigner.com</display-name>
<resource-ref>
<description>Resource reference to a factory for java.sql.Connection instances that may be used for talking to a particular database that is configured in the server.xml file.</description>
<res-ref-name>jdbc/MSSQL_Tests</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
Finally here is the error that I am getting. (http://www.testdesigner.com/index.jsp)
It's a null pointer exception when I am trying to run my query. It appears that the lookup is failing.
I am using apache's QueryRunner library (again this works with Resin locally).
I'll include my Java code below:
package net.bacman.database;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.List;
/**
* Date: Mar 13, 2004
* Time: 3:10:57 AM
*/
public class Database {
// Datasources
private static DataSource MySQLDB_Halo = null;
private static DataSource MySQLDB_TestForums = null;
private static DataSource MSSQLDB_Tests = null;
// Databases
public static final String MYSQL_HALO_DATABASE = "swella2_Halo";
public static final String MYSQL_TESTSFORUMS_DATABASE = "TestsForums";
public static final String MSSQL_TESTS_DATABASE = "Tests";
// DataSource Lookups
private static final String MYSQL_HALO_DATASOURCE = "jdbc/MySQL_Halo";
private static final String MYSQL_TESTSFORUMS_DATASOURCE = "jdbc/MySQL_TestsForums";
private static final String MSSQL_TESTS_DATASOURCE = "jdbc/MSSQL_Tests";
static {
try {
Context env = (Context) new InitialContext().lookup("java:comp/env");
MySQLDB_Halo = (DataSource) env.lookup(MYSQL_HALO_DATASOURCE);
MySQLDB_TestForums = (DataSource) env.lookup(MYSQL_TESTSFORUMS_DATASOURCE);
MSSQLDB_Tests = (DataSource) env.lookup(MSSQL_TESTS_DATASOURCE);
} catch (NamingException ne) {
System.out.println("NamingException: " + ne.getMessage());
}
}
public static List execute(String DB, String query) throws SQLException {
QueryRunner run = null;
if (DB == null) {
throw new IllegalArgumentException("Paramater DB is null!");
} else if (DB.equals(MYSQL_HALO_DATABASE)) {
run = new QueryRunner(MySQLDB_Halo);
} else if (DB.equals(MYSQL_TESTSFORUMS_DATABASE)) {
run = new QueryRunner(MySQLDB_TestForums);
} else if (DB.equals(MSSQL_TESTS_DATABASE)) {
run = new QueryRunner(MSSQLDB_Tests);
} else {
throw new IllegalArgumentException("Uknown Database: " + DB);
}
ResultSetHandler h = new MapListHandler();
return (List) run.query(query, h);
}
}