由于 jdbc 驱动加载,Tomcat 无法启动

Posted

技术标签:

【中文标题】由于 jdbc 驱动加载,Tomcat 无法启动【英文标题】:Tomcat fails to start because of jdbc driver loading 【发布时间】: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 消息。 【参考方案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。这个解释是有道理的。

以上是关于由于 jdbc 驱动加载,Tomcat 无法启动的主要内容,如果未能解决你的问题,请参考以下文章

无法加载驱动程序请问怎么办?

从 2.6 升级到 3.7 时,BIRT JDBCException“无法加载 JDBC 驱动程序类:com.mysql.jdbc.Driver”

Java做数据库连接池的时候加载oracle的JDBC驱动时总是提示找不到驱动类

JDBC02 加载JDBC驱动 建立连接

Cloudbees、Tomcat 和 Spring:“无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序”

Tomcat、MySQL -> 无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序