销毁Web应用程序上下文时关闭Jetty DataSources

时间:2010-11-26 16:03:14

标签: jetty jndi c3p0

我正在使用maven-jetty-plugin在开发模式下运行Web应用程序。另外,我在jetty-env.xml

中配置了c3p0 JNDI数据源
<?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中销毁已定义资源的引用,而且我也不愿意使用仅限开发的钩子,因为生产设置不同。

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

1 个答案:

答案 0 :(得分:0)

答案是使用jetty-env.xml删除maven-jetty-pluginconfigure an additional jettyConfig parameter的引用。

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