I am making a web-app with Tomcat 6 as the container and I'm trying to use connection pooling. The jdbc driver I am using is jtds-1.2.2.
The pool works fine when the driver jar is placed under ${Catalina_Home}/lib
, but my hosting provider would not let me do so.
I get a CNF-Exception when the driver is placed in the WEB-INF/lib
.
Could someone please provide a solution where I won't have to access the tomcat installation?
If you don't have control over the server, then you're lost. Just create the connection pool yourself instead of letting the container do it.
I suggest to use c3p0 for this (which is far better than Tomcat's builtin DBCP since it's locked to a single thread). Put the c3p0 libraries in the /WEB-INF/lib
and create it as per its documentation:
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("org.postgresql.Driver");
dataSource.setJdbcUrl("jdbc:postgresql://localhost/testdb");
dataSource.setUser("dbuser");
dataSource.setPassword("dbpassword");
// ...
Connection connection = null;
// ...
try {
connection = dataSource.getConnection();
// ...
} finally {
// ...
if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} // Always close resources in finally!
}
To use Tomcat's connection pool, you must copy the JDBC Driver's jar into $CATALINA_HOME/lib
(as documented) so that the driver class is visible through the Common class loader or DBCP won't be able to find it, hence the ClassNotFoundException
. Tomcat's class loaders hierarchy is illustrated below:
Bootstrap
|
System
|
Common
/ \
Webapp1 Webapp2 ...
And libraries from WEB-INF/lib
are not visible from the Common class loader (which is a good thing).
If you can't copy your driver into $CATALINA_HOME/lib
, you won't be able to use Tomcat's connection pool. In that case, you'll have to use a standalone connection pool (and to bundle it along your driver in WEB-INF/lib
). And I second BalusC here, I would use C3P0.