web-dev-qa-db-fra.com

tomcat7 - jdbc datasource - Ceci est très susceptible de créer une fuite de mémoire

Je reçois les messages suivants dans le fichier journal catalina.out lorsque Tomcat est arrêté. J'utilise Tomcat 7.x et la source de données Tomcat JDBC.

Mar 26, 2013 1:17:52 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesJdbc 
SEVERE: The web application [/my_webapp] 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. 
Mar 26, 2013 1:17:52 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/my_webapp] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.

Le premier prétend que la DataSource a été désinscrite de force, donc ça va. Cependant, c'est étrange parce que j'ai configuré la méthode destroy comme ceci:

<bean name="dataSource" class="org.Apache.Tomcat.jdbc.pool.DataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</bean>  

Je ne sais pas pourquoi j'obtiens le deuxième. Celui sur le "Minuteur d'annulation de déclaration MySQL".

Toute aide est appréciée

EDIT 1: J'ai essayé le correctif suggéré par @Zelldon et il supprime la première erreur. Cependant, le MySQL Statement Cancellation Timer le problème lié persiste

23
arahant

Essayez de mettre le connecteur/pilote SQL dans le Tomcat/lib et non dans la guerre. Parce que chaque fois que vous déployez la guerre, le connecteur/pilote sera créé, parfois le garbage collector ne peut pas les supprimer, ce qui se terminera par une fuite de mémoire. Essayez donc de déplacer le connecteur dans le dossier Tomcat/lib.

Veuillez lire les réponses suivantes:

Pourquoi le pilote JDBC doit-il être placé dans le dossier Tomcat_HOME/lib?

Comment configurer Tomcat pour se connecter à MySQL

34
Zelldon

Il pourrait être lié à ce bogue dans le connecteur jdbc MySQL: http://bugs.mysql.com/bug.php?id=65909 .

Vous pouvez attendre que l'équipe MySQL le corrige, ou vous essayez d'utiliser le connecteur JDBC Drizzle qui fonctionne bien avec MySQL (il vous suffit de changer le paramètre dans la connexion URL) et, dans mes tests , n'a pas ce genre de bogue.

1
Atropo

J'ai rencontré le même problème que vous, et je viens de restaurer la version pom de mysql-connector-Java de 8.0.16 à 8.0.15 et le problème a été résolu, je pense que c'est l'inégal entre la version du connecteur et mysql qui a causé le problème

0
Cheng Jiang