Java 在Tomcat容器中放置c3p0依赖项的位置

Java 在Tomcat容器中放置c3p0依赖项的位置,java,spring,postgresql,tomcat,c3p0,Java,Spring,Postgresql,Tomcat,C3p0,我的印象是,数据库驱动程序(postgres-x.x.jar)和连接池程序(c3p0)的库都必须驻留在容器的lib中(例如,对于Tomcat7,$CATALINA_HOME/lib) 但是,关于将连接池的jar放入容器与将其放入应用程序的war中的官方C3p0文档: 将文件lib/c3p0-0.9.5.2.jar和lib/mchange-commons-java-0.2.11.jar放在类路径中的某个位置(或者应用程序的类加载器可以找到它的任何其他位置)。就这样 新tomcat安装中的一个最新问

我的印象是,数据库驱动程序(
postgres-x.x.jar)和连接池程序(
c3p0
)的库都必须驻留在容器的lib中(例如,对于Tomcat7,
$CATALINA_HOME/lib

但是,关于将连接池的jar放入容器与将其放入应用程序的war中的官方C3p0文档:

将文件lib/c3p0-0.9.5.2.jar和lib/mchange-commons-java-0.2.11.jar放在类路径中的某个位置(或者应用程序的类加载器可以找到它的任何其他位置)。就这样

新tomcat安装中的一个最新问题(j
ava.lang.NoClassDefFoundError:com/mchange/v2/ser/Indirector
,当我在应用程序的WAR中有m
change commons java依赖项,而在
$CATALINA_HOME/lib
中有
c3p0
依赖项时)使我重新考虑了这个问题,但是我找不到任何关于这些图书馆放在哪里的权威信息

常用应用程序配置
在我的例子中,
c3p0
配置是通过应用程序类路径中的Springbean进行的:

<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        scope="singleton" destroy-method="close">
        <property name="driverClass">
            <value>org.postgresql.Driver</value>
        </property>
        <property name="jdbcUrl">
            <value>${jdbc.url}</value>
        </property>
        <property name="user">
            <value>${jdbc.user}</value>
        </property>
        <property name="password">
            <value>${jdbc.pw}</value>
        </property>
        ...
<bean> 

org.postgresql.Driver
${jdbc.url}
${jdbc.user}
${jdbc.pw}
...
如果我在同一个
Tomcat
容器中有多个应用程序,那么每个应用程序的war中将包含一个类似这样的c3p0bean

内存泄漏?

postgres.jar
c3p0.jar
放在容器的
lib/
中而不在战争中的假设是后者会导致内存泄漏

Postgres驱动程序泄漏

JDBC驱动程序在JVM范围内的singleton DriverManager中注册自己,该管理器由所有web应用程序共享。如果您从两个不同的web应用程序注册了两次相同的JDBC驱动程序(与类名相同),这可能会导致您的问题。如果您的web应用程序使用同一JDBC驱动程序的不同版本,则问题更大。

c3p0泄漏 之后,我们将c3p0移动到
$CATALINA_HOME/lib
(在取消部署应用程序时,我们收到了类似的警告)


它们应该驻留在Tomcat还是应用程序的lib/中

是否需要将jar放在Tomcat的lib目录中取决于Tomcat是否需要知道它。这取决于你是如何配置的

一般来说,如果您在Tomcat配置文件中提到一个类,那么该类(以及它所依赖的类)必须位于Tomcat的lib目录中

例如,如果在Tomcat的配置文件中配置数据源,则需要使驱动程序类对Tomcat可用。相反,如果您在应用程序代码中配置数据源,则不会


您没有指定如何配置C3P0,因此我们无法告诉您jar需要在哪里。当然,如果Tomcat需要它,但它不在那里,那么您应该看到异常被记录下来,事情将无法正常工作。

您是否需要将jar放入Tomcat的lib目录取决于Tomcat是否需要知道它。这取决于你是如何配置的

一般来说,如果您在Tomcat配置文件中提到一个类,那么该类(以及它所依赖的类)必须位于Tomcat的lib目录中

例如,如果在Tomcat的配置文件中配置数据源,则需要使驱动程序类对Tomcat可用。相反,如果您在应用程序代码中配置数据源,则不会


您没有指定如何配置C3P0,因此我们无法告诉您jar需要在哪里。当然,如果Tomcat需要它,但它不在那里,那么您应该看到异常被记录下来,事情将无法正常工作。

c3p0属性文件在应用程序的类路径中(我想,在该文件中定义了驱动程序类)。即使我在同一个容器中有多个应用程序,我也会在每次战争中有一个c3p0。然而,将postgres和c3p0 JAR放在容器中的假设是,如果将它们放在每个应用程序的warI上,内存泄漏将爬行。为上述问题添加了更多上下文信息。c3p0属性文件位于应用程序的类路径中(说实话,我认为驱动程序类是在该文件中定义的)。即使我在同一个容器中有多个应用程序,我也会在每个war中有一个c3p0。但是,将postgres和c3p0 JAR放入容器的假设是,如果将它们放在每个应用程序的war上,内存泄漏将爬网。我为上述问题添加了更多上下文信息。