Tomcat连接池,为web-app安装jdbc驱动程序

时间:2010-05-20 12:12:00

标签: java tomcat jdbc connection-pooling

我正在制作一个以 Tomcat 6 作为容器的网络应用程序,我正在尝试使用连接池。我正在使用的jdbc驱动程序是 jtds-1.2.2 当驱动程序jar放在${Catalina_Home}/lib下时,池工作正常,但我的托管服务提供商不允许我这样做。

当驱动程序放在WEB-INF/lib

时,我收到CNF异常

有人可以提供我不需要访问tomcat安装的解决方案吗?

2 个答案:

答案 0 :(得分:5)

如果您无法控制服务器,那么您就丢失了。只需自己创建连接池,而不是让容器执行它。

我建议使用c3p0(这比Tomcat的内置DBCP好得多,因为它被锁定到一个线程)。将c3p0库放在/WEB-INF/lib中,然后按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!
}

答案 1 :(得分:3)

要使用Tomcat的连接池,必须将JDBC驱动程序的jar复制到$CATALINA_HOME/lib(作为documented),以便通过{{3}显示驱动程序类或者DBCP将无法找到它,因此ClassNotFoundException。 Tomcat的类加载器层次结构如下所示:

      Bootstrap
          |
       System
          |
       Common
       /     \
  Webapp1   Webapp2 ... 

来自WEB-INF/lib的库在 Common类加载器中是不可见的(这是一件好事)。

如果您无法将驱动程序复制到$CATALINA_HOME/lib,则无法使用Tomcat的连接池。在这种情况下,您将必须使用独立的连接池(并在WEB-INF/lib中将其捆绑在您的驱动程序中)。我在这里第二个Common class loader,我会使用C3P0。