1

我正在使用maven-jetty-plugin在开发模式下运行 Web 应用程序。另外,我在以下位置配置了一个 c3p0 JNDI 数据源jetty-env.xml

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
  <Configure id="wac" class="org.mortbay.jetty.webapp.WebAppContext">
    <New id="dataSource" class="org.mortbay.jetty.plus.naming.Resource">
        <Arg>
            <Ref id="wac" />
        </Arg>
        <Arg>jdbc/MyVeryOwnDB</Arg>
        <Arg>
            <New class="com.mchange.v2.c3p0.ComboPooledDataSource">
                 <Set name="driverClass">oracle.jdbc.driver.OracleDriver</Set>
                 <Set name="jdbcUrl">jdbc:oracle:thin:@X:Y:Z</Set>
                 <Set name="user">U</Set>
                 <Set name="password">P</Set>           
            </New>
        </Arg>
    </New>
</Configure>

虽然这工作得很好,但我注意到连接池在 webapp 重新部署时没有关闭 - c3p0 线程仍然存在,这意味着我得到了 PermGen 和 JDBC 连接泄漏。

我没有发现销毁 jetty-env.xml 中定义的资源的参考,而且我也不愿意放入仅限开发的钩子,因为生产设置不同。

如何确保在开发时重新部署应用程序时不会因连接池未关闭而导致泄漏?

4

1 回答 1

0

答案是删除引用jetty-env.xml使用jettyConfig.maven-jetty-plugin

<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" 
<Configure id="Server" class="org.mortbay.jetty.Server">
    <New id="dataSource" class="org.mortbay.jetty.plus.naming.Resource">
        <Arg></Arg> <!-- Global scope -->
        <!-- Other values elided for brevity -->
    </New>
</Configure>
于 2010-12-13T15:16:04.593 回答