web-dev-qa-db-ja.com

Webアプリケーション[]は、[放棄された接続クリーンアップスレッド] com.mysql.jdbc.AbandonedConnectionCleanupThreadという名前のスレッドを開始したようです。

Web開発の途中で、Eclipse IDEでWebアプリを閉じると、約1分後に[〜#〜] warning [〜#〜]Eclipseコンソールで。

WARNING: The web application [/Spring.MVC] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Sep 06, 2014 8:31:55 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesThreads
WARNING: The web application [/Spring.MVC] 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. Stack trace of thread:
 Java.lang.Object.wait(Native Method)
 Java.lang.ref.ReferenceQueue.remove(Unknown Source)
 com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.Java:40)
Sep 06, 2014 8:32:00 PM org.Apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Sep 06, 2014 8:32:00 PM org.Apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Sep 06, 2014 8:32:03 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
    name: personPU
    ...]

これまでにメモリリークは発生していませんでしたが、VisualVMを確認しましたが、すべてが通常どおり動作していますが、このことを詳しく調べてみると、この警告はMySQLドライバーがリソースを解放していないか、適切に閉じられていないことが原因です(I正確に言う方法を知らない)と私はSO 関連する問題

oPが正しい「それについて心配しないでください」という答えでは不十分です。この警告は私に迷惑をかけます将来の永続性の問題を与える可能性があり、それは私を心配しています、私はOPが書いたコードを試しましたが、私は問題があるこのライブラリを動作させるために使用するライブラリこれは私が今までに得たものです。

import Java.sql.Driver;
import Java.sql.DriverManager;
import Java.sql.SQLException;
import Java.util.Enumeration;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.hibernate.annotations.common.util.impl.LoggerFactory;
import com.mysql.jdbc.AbandonedConnectionCleanupThread;
@WebListener
public class ContextFinalizer implements ServletContextListener {

private static final Logger LOGGER = LoggerFactory.getLogger(ContextFinalizer.class);

public void contextInitialized(ServletContextEvent sce) {
}

public void contextDestroyed(ServletContextEvent sce) {
    Enumeration<Driver> drivers = DriverManager.getDrivers();
    Driver d = null;
    while (drivers.hasMoreElements()) {
        try {
            d = drivers.nextElement();
            DriverManager.deregisterDriver(d);
            LOGGER.warn(String.format("Driver %s deregistered", d));
        }
        catch (SQLException ex) {
            LOGGER.warn(String.format("Error deregistering driver %s", d), ex);
        }
    }
    try {
        AbandonedConnectionCleanupThread.shutdown();
    }
    catch (InterruptedException e) {
        logger.warn("SEVERE problem cleaning up: " + e.getMessage());
        e.printStackTrace();
    }
  }
}

私はちょうど私が必要なライブラリを知りたい、またはこれを適切に実装するために適切なライブラリを使用している場合、私はロガーを使用すべきかさえ知りません、助けてくれてありがとう、

23
Jeff

この回答 を参照してください。 MySQLドライバーは{$Tomcat]/libアプリケーション間で共有。各アプリケーションに含まれていないことを確認してください。少なくとも私にとってはうまくいき、私は警告を取り除くことができました。

Mavenを使用している場合は、提供されている依存関係をマークします。


UPDATE:
根本原因は、Tomcatが複数のアプリケーションに共通のシングルトンに登録されているため、ドライバーのガベージコレクションに問題があることです。 1つのアプリケーションを閉じても、Tomcatはドライバーをリリースできません。こちらをご覧ください answer

25
borjab