我已经在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应用程序时如何摆脱池?
这个问题是自我造成的(大多数情况是这样)。我的数据源是在我的Web应用程序的web.xml中配置的,而我是通过JNDI引用它的。现在,按照Spring参考文档(第13.3.1节)中所示创建数据源,该destroy方法负责关闭数据源和池。
destroy
如果需要使用JNDI数据源,则必须ServletContextListener在该contextDestroyed方法中关闭实现的类中的数据源。
ServletContextListener
contextDestroyed