我有一个部署到Tomcat 7.0.54的Web应用程序,它使用数据源连接到Oracle 11g数据库.数据源已配置META-INF/context.xml
,我已将ojdbc7.jar放入<tomcat-install-dir>/lib
.我使用JNDI查找来检索我存储在单例中的数据源,以便每个DAO类都可以使用它.
一切都按预期工作,但是当我取消部署应用程序(通过Tomcat管理器应用程序)时,我在日志中看到:
Oct 03, 2014 3:06:55 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/myapp] appears to have started a thread named [oracle.jdbc.driver.BlockSource.ThreadedCachingBlockSource.BlockReleaser] but has failed to stop it. This is very likely to create a memory leak.
Oct 03, 2014 3:06:57 PM org.apache.catalina.startup.HostConfig undeploy
INFO: Undeploying context [/myapp]
Run Code Online (Sandbox Code Playgroud)
当我调试时,我可以看到一旦访问数据库就会创建这个线程(通过数据源).
我的数据源配置:
<Context antiResourceLocking="false">
<Resource name="jdbc/myapp" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
maxActive="20" maxIdle="10" maxWait="-1"
username="myuser" password="mypass"
url="jdbc:oracle:thin:@myserver:1521:mysid"
removeAbandoned="true" removeAbandonedTimeout="10" logAbandoned="true"
validationQuery="SELECT 1 FROM DUAL"
testOnBorrow="true" testOnReturn="true" testWhileIdle="true"
timeBetweenEvictionRunsMillis="1800000" numTestsPerEvictionRun="3"
minEvictableIdleTimeMillis="1800000"
/>
</Context>
Run Code Online (Sandbox Code Playgroud)
编辑
进一步的调查表明,无论在应用程序(或servlet)初始化期间是否访问数据源,都会出现问题.
实际上,只有在使用Oracle的JDBC驱动程序的12c版本(ojdbc6.jar或ojdbc7.jar)时才会创建有问题的线程,因此只存在问题.
如果我恢复使用ojdbc6.jar的11.2.0.4版本,则永远不会创建线程,并且永远不会出现内存泄漏警告.
我应该降级JDBC驱动程序(如/sf/answers/642408441/中所述)?
这是正常现象,在 Tomcat 中热部署时会出现这种情况。它通常不会在生产中给您带来任何问题,因为您通常不会在生产中保持热部署更新,您只需停止并重新启动服务器即可。
归档时间: |
|
查看次数: |
13094 次 |
最近记录: |