一尘不染

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

tomcat

我已经在Tomcat 7.0.22上部署了一个最小的Spring Web应用程序-
它由几个页面,一个控制器,一个服务和一个DAO组成,该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" />

部署Web应用程序时,我看到出现5个连接(从SQL Developer查询v $
session)。当我取消部署webapp时,连接仍然存在(处于等待状态)。每次重新部署Web应用程序时,都会显示5个新连接。

看来池仍在徘徊-Tomcat的管理器应用程序上的“查找泄漏”按钮告诉我该应用程序正在泄漏内存。

取消部署Web应用程序时如何摆脱池?


阅读 194

收藏
2020-06-16

共1个答案

一尘不染

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

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

2020-06-16