Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat+;TomcatJDBC ServletContextListener开放线程_Java_Tomcat_Jdbc_Tomcat Jdbc - Fatal编程技术网

Java Tomcat+;TomcatJDBC ServletContextListener开放线程

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

从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 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?我的意思是如何配置相同的?