[英]c3p0 Connection pool memory leak redeploy tomcat
我有這些代碼用於關閉c3p0連接管理器,但似乎還有一個未關閉的線程。 我錯過了什么嗎?
Oct 11, 2016 5:12:09 PM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing WebApplicationContext for namespace 'dispatcherServlet-servlet': startup date [Tue Oct 11 17:11:58 PHT 2016]; parent: Root WebApplicationContext
2016-10-11 17:12:09 - [INFO ] CRMContextListener - Trying to Close
2016-10-11 17:12:09 - [INFO ] CRMContextListener - Close Success
Oct 11, 2016 5:12:09 PM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing Root WebApplicationContext: startup date [Tue Oct 11 17:11:44 PHT 2016]; root of context hierarchy
Oct 11, 2016 5:12:09 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: A web application registered the JBDC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. Oct 11, 2016 5:12:09 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: A web application appears to have started a thread named [C3P0PooledConnectionPoolManager[identityToken->2xjsis9j1do3mrp1m3tqb8|fb6fd9c]-DeferredStatementDestroyerThread-#0] but has failed to stop it. This is very likely to create a memory leak.
這是我的servlet監聽器的代碼
public void contextDestroyed(ServletContextEvent sce) {
logger.info("Trying to Close");
for (Object o : C3P0Registry.getPooledDataSources()) {
try {
((PooledDataSource) o).close();
} catch (Exception e) {
logger.info("No thread was open...");
}
}
logger.info("Close Success");
}
這是我對c3p0 xml的配置
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
<property name="jdbcUrl" value="jdbc:oracle:thin:@sph-pdc-vm 1042:1521:DEV" />
<property name="user" value="TSW" />
<property name="password" value="TSW2015#" />
<property name="minPoolSize" value="2" />
<property name="maxPoolSize" value="20" />
<property name="initialPoolSize" value="5" />
<property name="testConnectionOnCheckin" value="true" />
<property name="idleConnectionTestPeriod" value="100" />
<property name="maxIdleTimeExcessConnections" value="5" />
<property name="maxStatementsPerConnection" value="10" />
<property name="acquireIncrement" value="1" />
<property name="statementCacheNumDeferredCloseThreads" value="1" />
<property name="acquireRetryAttempts" value="2" />
<property name="acquireRetryDelay" value="2000" />
</bean>
提前致謝....
它可能不是真正的內存泄漏,而是誤報,因為c3p0的線程需要一些時間來關閉,而close()
不等待它完成,它是異步的。 所以你有一個煩人的消息。 看看這個github問題 ,感謝github上的BuğraGedik。 如果你想測試這個理論,你可能會在調用close()
后添加一秒左右的延遲[即調用Thread.sleep(1000)
]並查看消息是否消失。
雖然我認為這不是您的問題,但您可以考慮添加一些Tomcat參數,以確保嘗試關閉()線程始終成功。 只需添加......
<property name="privilegeSpawnedThreads" value="true" />
<property name="contextClassLoaderSource" value="library" />
請參閱c3p0的文檔 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.