Ho un'app Web distribuita su Tomcat 7.0.54 che utilizza un'origine dati per connettersi a un database Oracle 11g. L'origine dati è configurata in META-INF/context.xml
e ho inserito ojdbc7.jar in <tomcat-install-dir>/lib
. Io uso una ricerca JNDI per recuperare l'origine dati che immagazzino in un singleton in modo che ogni classe DAO possa usarla.Perdita di memoria su Tomcat 7 con i driver Oracle JDBC 12c - impossibile interrompere il thread oracle.jdbc.driver
Tutto funziona come previsto, tuttavia quando ho annullare la distribuzione dell'applicazione (tramite Tomcat Manager app) che vedo nei log:
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]
Quando il debug posso vedere questa discussione viene creato non appena il database è accesso (tramite l'origine dati).
La mia origine dati di configurazione:
<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>
EDIT
Ulteriori indagini hanno rivelato che il problema si verifica se l'origine dati si accede durante l'applicazione (o servlet) inizializzazione.
In realtà, il thread problematico viene creato e quindi il problema esiste solo quando si utilizzano le versioni 12c dei driver JDBC di Oracle (ojdbc6.jar o ojdbc7.jar).
Se si ripristina l'utilizzo della versione 11.2.0.4 di ojdbc6.jar, il thread non viene mai creato e l'avviso di perdita di memoria non viene mai visualizzato.
Devo eseguire il downgrade del driver JDBC (come suggerito in https://stackoverflow.com/a/9177263/4105953)?
Assicurarsi che il driver di Oracle non sia anche nella directory 'WEB-INF/lib'. In questo modo si registrerebbe automaticamente e avvierà alcune delle cose di Oracle JDBC. Vedi anche [qui] (http://stackoverflow.com/questions/3320400/to-prevent-a-memory-leak-the-jdbc-driver-has-been-forcibly-unregistered). –
@ M.Deinum grazie, ma ho già assicurato che il driver JDBC è solo in 'tomcat/lib' e non l'applicazione' WEB-INF/lib' – finchie