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

Pau*_*aul 6 tomcat connection-pooling jdbc tomcat7

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

webapp配置为使用新的Tomcat JDBC连接池 - 这是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" />
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pau*_*aul 5

这个问题是自我造成的(大多数情况是这样)。我的数据源是在我的Web应用程序的web.xml中配置的,我是通过JNDI引用它的。现在,按照Spring参考文档(第13.3.1节)中的说明创建数据源,该destroy方法负责关闭数据源和池。

如果需要使用JNDI数据源,则必须ServletContextListener在该contextDestroyed方法中关闭实现的类中的数据源。