当您在Tomcat中停止Web应用程序时,它会尝试关闭它启动的线程并关闭一堆资源,例如JDBC驱动程序.虽然在这种情况下,它能够关闭它们,但自己做的更安全.
您可以在ServletContextListener中执行此操作.我实施了我的如下
@WebListener // register it as you wish
public class ContainerContextClosedHandler implements ServletContextListener {
private static final Logger logger = LoggerFactory.getLogger(ContainerContextClosedHandler.class);
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// nothing to do
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
Enumeration drivers = DriverManager.getDrivers();
Driver driver = null;
// clear drivers
while(drivers.hasMoreElements()) {
try {
driver = drivers.nextElement();
DriverManager.deregisterDriver(driver);
} catch (SQLException ex) {
// deregistration failed, might want to do something, log at the very least
}
}
// MySQL driver leaves around a thread. This static method cleans it up.
try {
AbandonedConnectionCleanupThread.shutdown();
} catch (InterruptedException e) {
// again failure, not much you can do
}
}
}
MySQL确实启动了一个Tomcat无法关闭的线程.对于当前版本(5.1.23),他们提供了AbandonedConnectionCleanupThread类来关闭生成的线程,如上所示.