我有一个最小的 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/