web-dev-qa-db-fra.com

L'application Web [] semble avoir démarré un thread nommé [Abandoned connection cleanup thread] com.mysql.jdbc.AbandonedConnectionCleanupThread

Au milieu de mon développement Web, je ferme juste mon application Web dans mon IDE Eclipse, environ une minute, je viens de voir un avertissement [~ # ~] [~ # ~] dans ma console 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
    ...]

Cela n'a pas causé de fuite de mémoire jusqu'à présent, j'ai vérifié mon VisualVM, tout fonctionne comme d'habitude, mais en cherchant plus sur cette chose, je me rends compte que cet avertissement est dû au fait que le pilote MySQL ne libère pas de ressources ou n'est pas fermé correctement (je Je ne sais pas comment le dire exactement) et je me suis retrouvé dans ce post à SO problème connexe

et l'OP a raison la réponse "ne t'inquiète pas" ne sera pas suffisante. Cet avertissement me dérange car il peut me donner de futurs problèmes de persistance et cela m'inquiète beaucoup, j'ai essayé le code que l'OP a écrit mais je suis ayant un problème quelles bibliothèques dois-je utiliser pour faire fonctionner ce code. C'est ce que je suis allé bien loin ..

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();
    }
  }
}

Je veux juste savoir de quelles bibliothèques j'ai besoin ou si j'utilise les bonnes bibliothèques pour les implémenter correctement, je ne sais même pas quel enregistreur dois-je utiliser, merci pour toute aide,

23
Jeff

Voir cette réponse . Il semble que le pilote MySQL devrait être dans {$Tomcat]/lib partagé entre les applications. Vérifiez que vous ne l'incluez pas avec chaque application. Au moins, cela a fonctionné pour moi et j'ai pu supprimer l'avertissement.

Si vous utilisez Maven, marquez la dépendance comme indiqué.


MISE À JOUR:
La cause première est que Tomcat a des problèmes pour récupérer le pilote car il est enregistré dans un singleton commun à plusieurs applications. La fermeture d'une application ne permet pas à Tomcat de libérer le pilote. Voir ceci réponse .

25
borjab