Tomcat не запускается из-за загрузки драйвера jdbc
Здесь соответствующая часть журнала запуска tomcat:
SEVERE: Context [/f360] startup failed due to previous errors
Apr 8, 2010 6:45:56 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: A web application registered the JBDC driver [org.apache.derby.jdbc.ClientDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Apr 8, 2010 6:45:56 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: A web application registered the JBDC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Apr 8, 2010 6:45:56 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: A web application registered the JBDC driver [com.microsoft.sqlserver.jdbc.SQLServerDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Проблема, которую он вызывает, заключается в том, что в основном это приводит к тому, что веб-приложение не запускается должным образом.
Любые идеи, как это исправить?
Ответы
Ответ 1
Очевидно, что это ошибка в стеке поставщика JDBC. Но в любом случае я использовал какой-то аналогичный код в Jetty:
public class CleanupContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
Logger logger = Logger.getLogger("CleanupContextListener");
Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
Driver driver = drivers.nextElement();
ClassLoader driverclassLoader = driver.getClass().getClassLoader();
ClassLoader thisClassLoader = this.getClass().getClassLoader();
if (driverclassLoader != null && thisClassLoader != null && driverclassLoader.equals(thisClassLoader)) {
try {
logger.warn("Deregistering: " + driver);
DriverManager.deregisterDriver(driver);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {}
}
Ответ 2
Если это проблема с DBCP, остановите tomcat, убейте любой оставшийся процесс (в случае, если у вас запущено более одного tomcat), удалите каталог temcat temp (и, возможно, рабочий каталог) и повторите попытку.
Ответ 3
Сообщения SEVERE, касающиеся драйверов JDBC, вызваны проблемой DBCP. См. DBCP-332
Ответ 4
Иногда, особенно при использовании приложения Spring на Tomcat, сообщение об ошибке вводит в заблуждение - когда нет никакого отношения к какой-либо ошибке драйвера JDBC, но только сбой какого-либо приложения BEAN init-method (или @PostConstruct).
Трассировка стека ошибок скрыта и отображается только в tomcat/logs/localhost.xxx
файл.
Просто знайте об этом поведении.
Мне это стоило много времени.
С уважением,
Йоси Лев