我有一个部署到Tomcat 7.0.22的最小Spring Web应用程序 - 它包含几个页面,一个控制器,一个服务和一个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时,连接仍然存在(状态为WAITING)。每次重新部署我的webapp时,都会显示5个新连接。
看起来游泳池仍在闲逛 - 而Tomcat经理应用程序中的“Find Leaks”按钮告诉我应用程序正在泄漏内存。
取消部署webapp时如何摆脱池?
答案 0 :(得分:4)
问题是自我造成的(大部分都是)。我的数据源是在我的webapp的web.xml中配置的,我通过JNDI引用它。我现在创建我的数据源,如Spring参考文档(section 13.3.1)中所示,destroy
方法负责关闭数据源和池。
如果我被要求坚持使用JNDI数据源,我将不得不在ServletContextListener
方法中实现contextDestroyed
的类中关闭数据源。
答案 1 :(得分:2)
这是Apache Tomcat bugzilla中报告的行为,参考:
https://issues.apache.org/bugzilla/show_bug.cgi?id=25060
已从Tomcat 7.0.11更正。您使用的是哪个版本的Tomcat?
如果您使用如“应用程序级别”的Spring参考中所述创建数据源,那么如果您拥有大量应用程序和许多服务器,则在管理任务方面会有一点开销。
答案 2 :(得分:1)
我遇到了同样的问题,我无法使用spring,因此我使用org.apache.tomcat.jdbc.pool.DataSourceProxy来关闭Tomcat数据源。此API为您提供尚未实现JDK DataSource接口的功能。
DataSourceProxy myDataSource = (DataSourceProxy) myDataSource;
myDataSource.close();