【问题标题】:Tomcat fails to start because of jdbc driver loading由于 jdbc 驱动加载,Tomcat 无法启动
【发布时间】:2011-02-05 23:20:21
【问题描述】:

这是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应用程序无法正常启动。

任何想法如何解决这个问题?

【问题讨论】:

  • 由于previous错误,启动失败。请更新您的问题以包含这些错误。它们是这个问题的根本原因
  • 问题是之前没有列出任何错误。只有 INFO 消息。

标签: jdbc tomcat6


【解决方案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】:

    有时,尤其是在 Tomcat 上使用 Spring 应用程序时,错误消息具有误导性 - 当根本与任何 JDBC 驱动程序错误无关,而只是某些应用程序 BEAN 初始化方法(或 @PostConstruct)失败时。 错误堆栈跟踪被隐藏,仅出现在 tomcat/logs/localhost.xxx 中 文件。 请注意这种行为。 这花了我很多时间。

    问候, 尤西列夫

    【讨论】:

    • 这是真的。在部署我的 Grails 应用程序(使用 Spring 框架)时,它在 conf/DataSource.groovy 文件中编译了数据库密码。当然,我使用了错误的密码,但报告的唯一错误是 JDBC 驱动程序的这种奇怪注册。没有记录其他数据库错误。 Spring 必须有一个选项来详细记录所有数据库启动操作。
    • 确实如此。真正的原因与jdbc无关。
    • 这花了我几个小时!谢谢 Yosi Lev
    【解决方案3】:

    如果是 DBCP 问题,则停止 tomcat,终止所有剩余进程(如果您有多个 tomcat 正在运行),删除 tomcat 临时目录(可能还有工作目录),然后重试。

    【讨论】:

    • 这对我很有帮助。我尝试杀死tomcat,重新启动,一切。当我关闭,删除临时目录,然后重新启动时,一切正常 :-) 谢谢!
    【解决方案4】:

    有关 JDBC 驱动程序的 SEVERE 消息是由 DBCP 问题引起的。见DBCP-332

    【讨论】:

    • DBCP 属于哪里?雄猫?我对 Tomcat6/JDK6/MacOS X 有上述错误,但它(相同的应用程序,使用 postgres+jdbc)在 Tomcat/JDK6/WinXP 上运行良好。谢谢!
    • 感谢您的参考 rgielen。这个解释是有道理的。
    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 2013-03-03
    • 2015-10-10
    • 2017-05-17
    • 2017-01-15
    • 1970-01-01
    相关资源
    最近更新 更多