Java Tomcat+;TomcatJDBC ServletContextListener开放线程
从Tomcat取消部署应用程序时,有线程处于打开状态Java Tomcat+;TomcatJDBC ServletContextListener开放线程,java,tomcat,jdbc,tomcat-jdbc,Java,Tomcat,Jdbc,Tomcat Jdbc,从Tomcat取消部署应用程序时,有线程处于打开状态 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads SEVERE: The web application [/services] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is ver
org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/services] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak.
org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/services] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak.
应用程序维护一个数据源映射,并运行ScheduledExecutorService,每5分钟更新一次映射
@WebListener
public class DataSourceFactory implements ServletContextListener
{
private static Map<String, DataSource> rdsDataSourceMap;
private static ScheduledExecutorService scheduler;
private static final long CONNECTION_MAP_REFRESH_INTERVAL = 5;
@Override
public void contextInitialized(ServletContextEvent event)
{
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new Runnable(){
@Override
public void run() {
cacheDatasourceMap();
}
}, 0, CONNECTION_MAP_REFRESH_INTERVAL, TimeUnit.MINUTES);
}
@Override
public void contextDestroyed(ServletContextEvent event)
{
scheduler.shutdownNow();
if (localPool != null) {
localPool.close();
}
for (DataSource ds : rdsDataSourceMap.values()) {
if (ds != null) {
ds.close();
}
}
}
private void cacheDatasourceMap()
{
...
}
....
}
更新
在摆脱ScheduledExecutorService后,我仍然看到计时器线程保持打开状态。我在contextdestromed()
的末尾添加了一条日志语句,并验证它是否通过了关闭数据源的操作
我还验证了MySQL驱动程序在Tomcat的lib中,而不是在WAR中。首先,Tomcat对此无能为力,您正在使用JavaSE创建一个执行器。因此,应用服务器(JavaEE)不能也不应该管理您直接从JavaSE创建的Executor服务。如果您想使用java EE ExealToService,请考虑使用<代码> MauleDealPosieExtutoService < /C> >,因为使用App Server的线程池,您不必担心关闭。有了这些,问题就来了 您正在使用
shutdownNow()
,这是关闭ExecutorService
的一种“快速且肮脏”的方式。如果您想轻轻地关闭应用程序,我建议您将ExecutorService.shutdown()
与ExecutorService.waitivetermination()
结合使用
据该文件称,shutdownNow()
不保证实际可以停止什么
此方法不会等待主动执行的任务终止。
…
除了尽最大努力尝试停止处理积极执行的任务之外,没有其他保证 如果您关心等待任务停止,则需要使用
waittermination()
。shutdown()
或shutdownNow()
可以做的唯一事情就是调用interrupt()
,这可能会也可能不会真正停止线程。要等待终止,请执行以下操作:
executor.shutdown(); // or shutdownNow()
if (!executor.isTerminated())
executor.awaitTermination(10, TimeUnit.SECONDS); // wait for up to 10s
首先,Tomcat对此无能为力,您正在使用JavaSE创建一个执行器。因此,应用服务器(JavaEE)不能也不应该管理您直接从JavaSE创建的Executor服务。如果您想使用java EE ExealToService,请考虑使用<代码> MauleDealPosieExtutoService < /C> >,因为使用App Server的线程池,您不必担心关闭。有了这些,问题就来了 您正在使用
shutdownNow()
,这是关闭ExecutorService
的一种“快速且肮脏”的方式。如果您想轻轻地关闭应用程序,我建议您将ExecutorService.shutdown()
与ExecutorService.waitivetermination()
结合使用
据该文件称,shutdownNow()
不保证实际可以停止什么
此方法不会等待主动执行的任务终止。
…
除了尽最大努力尝试停止处理积极执行的任务之外,没有其他保证 如果您关心等待任务停止,则需要使用
waittermination()
。shutdown()
或shutdownNow()
可以做的唯一事情就是调用interrupt()
,这可能会也可能不会真正停止线程。要等待终止,请执行以下操作:
executor.shutdown(); // or shutdownNow()
if (!executor.isTerminated())
executor.awaitTermination(10, TimeUnit.SECONDS); // wait for up to 10s
如何在tomcat中获得并发JNDI?我的意思是如何配置相同的JNDI?如何在tomcat中获得并发JNDI?我的意思是如何配置相同的?