使用Oracle JDBC驱动程序12c的Tomcat 7上的内存泄漏 - oracle.jdbc.driver线程无法停止

fin*_*hie 5 java tomcat jdbc

我有一个部署到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/中所述)?

Tri*_*Man 0

这是正常现象,在 Tomcat 中热部署时会出现这种情况。它通常不会在生产中给您带来任何问题,因为您通常不会在生产中保持热部署更新,您只需停止并重新启动服务器即可。

  • 其他应用程序部署到我们的生产 Tomcat,其中一些应用程序的用户群比该应用程序大得多!当然,我不应该仅仅为了重新部署应用程序而重新启动生产 Tomcat 吗?这不是 Tomcat Manager 应用程序的用途吗? (5认同)