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

标签 tomcat jdbc connection-pooling tomcat7

我有一个最小的 Spring webapp 部署到 Tomcat 7.0.22 - 它由几个页面、一个 Controller 、一个服务和一个 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 时,连接仍然存在(处于等待状态)。每次我重新部署我的网络应用程序时,都会显示 5 个新连接。

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

当取消部署 web 应用程序时,我如何摆脱池?

最佳答案

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

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

关于tomcat - 为什么在我使用 Tomcat 7 JDBC 连接池取消部署 Web 应用程序时连接仍然存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8435359/

相关文章:

apache - $CATALINA_HOME 里面没有 conf

windows - 慢速 TCP 连接

java - 如果存储过程在 MSSQL Server 2005 上的选择之前进行更新,则没有结果集

java - JDBC 连接池说明

tomcat连接池

java - 如何在jsp中检索属性文件名?

java servlet编译错误

java - HikariCP 连接超时

c# - 为什么 C# 连接池有这么多 sp_resetconnections?

jsp - 用tomcat保护jsp Action 页面