当我使用Tomcat 7 JDBC连接池取消部署webapp时,为什么连接仍然存在?

时间:2011-12-08 17:53:32

标签: tomcat jdbc connection-pooling tomcat7

我有一个部署到Tomcat 7.0.22的最小Spring Web应用程序 - 它包含几个页面,一个控制器,一个服务和一个DAO,它有一个运行SELECT查询的方法。

webapp配置为使用新的Tomcat JDBC connection pool - 这是webapp的context.xml中的资源配置:

<Resource name="jdbc/myDB"
          auth="Container"
          type="javax.sql.DataSource"
          driverClassName="oracle.jdbc.OracleDriver"
          url="jdbc:oracle:thin:@blah blah"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          maxActive="15"
          initialSize="5"
          maxWait="40000"
          validationQuery="select 1 from dual"
          removeAbandoned="true"
          removeAbandonedTimeout="300"
          logAbandoned="false"
          username="user"
          password="pass"
          testOnBorrow="true"
          validationInterval="30000"
          timeBetweenEvictionRunsMillis="60000"
          minEvictableIdleTimeMillis="60000" />

当我部署webapp时,我看到出现了5个连接(从SQL Developer查询v $ session)。当我取消部署webapp时,连接仍然存在(状态为WAITING)。每次重新部署我的webapp时,都会显示5个新连接。

看起来游泳池仍在闲逛 - 而Tomcat经理应用程序中的“Find Leaks”按钮告诉我应用程序正在泄漏内存。

取消部署webapp时如何摆脱池?

3 个答案:

答案 0 :(得分:4)

问题是自我造成的(大部分都是)。我的数据源是在我的webapp的web.xml中配置的,我通过JNDI引用它。我现在创建我的数据源,如Spring参考文档(section 13.3.1)中所示,destroy方法负责关闭数据源和池。

如果我被要求坚持使用JNDI数据源,我将不得不在ServletContextListener方法中实现contextDestroyed的类中关闭数据源。

答案 1 :(得分:2)

这是Apache Tomcat bugzilla中报告的行为,参考:

https://issues.apache.org/bugzilla/show_bug.cgi?id=25060

已从Tomcat 7.0.11更正。您使用的是哪个版本的Tomcat?

如果您使用如“应用程序级别”的Spring参考中所述创建数据源,那么如果您拥有大量应用程序和许多服务器,则在管理任务方面会有一点开销。

答案 2 :(得分:1)

我遇到了同样的问题,我无法使用spring,因此我使用org.apache.tomcat.jdbc.pool.DataSourceProxy来关闭Tomcat数据源。此API为您提供尚未实现JDK DataSource接口的功能。

DataSourceProxy myDataSource = (DataSourceProxy) myDataSource;
myDataSource.close();   
  • 还使用factory =&#34; org.apache.tomcat.jdbc.pool.DataSourceFactory&#34;和ServletListener contextDestroyed方法。