我已经将一个最小的 Spring Web 应用程序部署到 Tomcat 7.0.22 - 它由几个页面、一个控制器、一个服务和一个 DAO 组成,该 DAO 有一个运行 SELECT 查询的方法。
Web 应用程序配置为使用新的Tomcat JDBC 连接池 http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html- 这是 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)。当我取消部署 web 应用程序时,连接仍然存在(处于等待状态)。每次我重新部署我的 web 应用程序时,都会出现 5 个新连接。
看来池仍然存在 - Tomcat 管理器应用程序上的“查找泄漏”按钮告诉我该应用程序正在泄漏内存。
当网络应用程序取消部署时,如何摆脱池?
这个问题是自己造成的(就像大多数问题一样)。我的数据源是在我的 web 应用程序的 web.xml 中配置的,我通过 JNDI 引用它。我现在创建数据源,如 Spring 参考文档中所示(第13.3.1节 http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jdbc.html#jdbc-datasource)和destroy
方法负责关闭数据源和池。
如果我被要求坚持使用 JNDI 数据源,我将不得不在实现的类中关闭数据源ServletContextListener
, 在里面contextDestroyed
method.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)