在Tomcat容器

时间:2017-08-10 18:29:14

标签: java spring postgresql tomcat c3p0

我的印象是数据库驱动程序(在我的情况下为postgres-x.x.jar)和连接池(c3p0)的库必须驻留在容器的lib中(例如,对于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安装中的当前问题(j ava.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector,当我在应用程序的WAR中有m change-commons-java dependency并且c3p0中有$CATALINA_HOME/lib依赖项时)重温这一点,但我找不到任何有关这些库放置位置的权威信息。

常用应用程序配置
在我的例子中,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容器中有多个应用程序,则每个应用程序都会有一个包含在其战争中的c3p0 bean。

内存泄漏?

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

Postgres驱动程序泄漏

This user states that JDBC 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 /?

1 个答案:

答案 0 :(得分:0)

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

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

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

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