【问题标题】:Where to put c3p0 dependency in Tomcat Container在 Tomcat 容器中放置 c3p0 依赖项的位置
【发布时间】:2018-01-19 03:18:00
【问题描述】:

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

但是,官方 C3p0 文档 doesn't provide any information 关于将连接池的 jar 放入容器中与将其放入应用程序的战争中:

将文件 lib/c3p0-0.9.5.2.jar 和 lib/mchange-commons-java-0.2.11.jar 放在 CLASSPATH 中的某个位置(或应用程序的类加载器可以找到的任何其他位置)。而已!

新的 tomcat 安装中的当前问题(java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector,当我在应用程序的 WAR 中有 mchange-commons-java dependency$CATALINA_HOME/lib 中的 c3p0 依赖项时)让我重新审视这个,但我不能查找有关将这些库放在何处的任何权威信息。

通常的应用程序配置
在我的情况下,c3p0 配置是通过应用程序类路径中的 spring bean 进行的:

<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> 

如果我在同一个Tomcat 容器中有多个应用程序,每个应用程序都会在其war 中包含一个这样的c3p0 bean。

内存泄漏?

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

Postgres 驱动程序泄漏

This user states thatJDBC drivers register themselves in the JVM-wide singleton DriverManager which is shared by all web apps. If you have the same (as in class name) JDBC driver register twice from two different web apps, this might cause your problem. This is even more problematic if your web apps use different versions of the same JDBC driver.

c3p0 中的泄漏 我们在 this comment on Stackoverflow 之后将 c3p0 移至 $CATALINA_HOME/lib(在取消部署应用程序时我们收到了类似的警告)。

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

【问题讨论】:

    标签: java spring postgresql tomcat c3p0


    【解决方案1】:

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

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

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

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

    【讨论】:

    • c3p0 属性文件位于应用程序的类路径中(而且我认为它在该文件中定义了驱动程序类)。即使我在同一个容器中有多个应用程序,我也会在每场战争中拥有一个 c3p0。但是,将 postgres 和 c3p0 jar 放在容器中的假设是,如果将它们放在每个应用程序的 war 中,内存泄漏就会爬行
    • 我在上面的问题中添加了更多上下文信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多