web-dev-qa-db-ja.com

jdbcドライバーがロードされているため、Tomcatが起動に失敗する

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.

それが引き起こす問題は、基本的にWebアプリが正しく起動しない原因になることです。

これを修正する方法はありますか?

14
Laran Evans

明らかに、これは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) {}    

}

6
Mond Raymond

DBCPの問題である場合は、Tomcatを停止し、残りのプロセスをすべて強制終了し(複数のTomcatを実行している場合)、Tomcatの一時ディレクトリ(およびおそらく作業ディレクトリ)を削除して、再試行します。

5
Doug

時々、特にTomcatでSpringアプリケーションを使用している場合、エラーメッセージは誤解を招く可能性があります。JDBCドライバーのエラーとはまったく関係がなく、一部のアプリケーションのBEA initメソッド(または@PostConstruct)の失敗のみです。エラースタックトレースは非表示で、Tomcat/logs/localhost.xxxファイルにのみ表示されます。この動作に注意してください。それは私に多くの時間を要しました。

よろしく、ヨシレフ

5
ylev

JDBCドライバーに関するSEVEREメッセージは、DBCPの問題が原因で発生します。 DBCP-332 を参照してください

4
rgielen