Je vois souvent ce problème apparaître. Oui, Tomcat 7 le désenregistre automatiquement, mais est-ce vraiment prendre le contrôle de votre code et une bonne pratique de codage? Vous voulez sûrement savoir que vous avez tout le code correct en place pour fermer tous vos objets, arrêter les threads de pool de connexion à la base de données et vous débarrasser de tous les avertissements. C'est certainement mon cas.
Voici comment je procède.
Étape 1 : Enregistrer un écouteur
web.xml
com.mysite.MySpecialListener
Étape 2 : Implémenter l'écouteur
com.mysite.MySpecialListener.java
public class MySpecialListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// Au démarrage de l'application, s'il vous plaît...
// En général, je crée un singleton ici, mets en place mon pool, etc.
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// À l'arrêt de l'application, s'il vous plaît...
// 1. Récupérer ce DataSource
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource datasource = (DataSource)envContext.lookup("jdbc/database");
// 2. Désenregistrer le pilote
try {
java.sql.Driver mySqlDriver = DriverManager.getDriver("jdbc:mysql://localhost:3306/");
DriverManager.deregisterDriver(mySqlDriver);
} catch (SQLException ex) {
logger.info("Impossible de désenregistrer le pilote :".concat(ex.getMessage()));
}
// 3. Pour plus de sûreté, supprimez la référence à dataSource pour que GC puisse en bénéficier.
dataSource = null;
}
}
N'hésitez pas à commenter et/ou ajouter...
4 votes
Peut être en double de stackoverflow.com/questions/2604630/…