我正在制作一个以 Tomcat 6 作为容器的网络应用程序,我正在尝试使用连接池。我正在使用的jdbc驱动程序是 jtds-1.2.2
当驱动程序jar放在${Catalina_Home}/lib
下时,池工作正常,但我的托管服务提供商不允许我这样做。
当驱动程序放在WEB-INF/lib
。
有人可以提供我不需要访问tomcat安装的解决方案吗?
答案 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。