的Tomcat启动失败,因为JDBC驱动程序加载的

问题描述:

这里的tomcat的启动日志的相关部分:的Tomcat启动失败,因为JDBC驱动程序加载的

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

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

+0

启动失败,因为以前* *的错误。请更新您的问题以包含这些错误。他们是这个问题的**根源。 – BalusC 2010-04-09 19:01:55

+0

问题是之前没有列出任何错误。只有INFO消息。 – 2010-04-16 17:54:17

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

+0

DBCP部分在哪里? Tomcat的?我有Tomcat6/JDK6/MacOS X的上述错误,但它(相同的应用程序,使用postgres + jdbc)在Tomcat/JDK6/WinXP上运行正常。谢谢! – 2011-03-08 07:27:12

+0

感谢您的参考rgielen。这个解释是有道理的。 – 2015-09-07 13:54:46

如果是DBCP问题,请停止tomcat,终止其他进程(如果您有多个tomcat正在运行),请删除tomcat temp目录(也可能是工作目录)并重试。

+0

这真的帮了我。我试图杀死tomcat,重新启动,一切。当我关机,删除临时目录,然后开始备份,一切正常:-)谢谢! – jpswain 2011-06-06 23:11:32

显然,这是JDBC提供程序堆栈中的一个错误。但无论如何,我以前在码头的一些类似的代码:

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) {}  

}

有时,特别是使用在Tomcat Spring应用程序时,该错误消息是误导 - 当有在不涉及任何JDBC驱动程序错误除了某些应用程序的BEAN初始化方法(或@PostConstruct)之外,所有这些都失败了。 错误堆栈跟踪是隐藏的,只出现在tomcat/logs/localhost.xxx 文件中。 只需注意这一行为。 这花了我很多时间。

问候, Yosi利

+0

这是真的。在部署我的Grails应用程序(使用Spring Framework)时,它具有在conf/DataSource.groovy文件中编译的数据库密码。当然,我使用了错误的密码,但唯一报告的错误是JDBC驱动程序的奇怪注册。没有其他数据库错误被记录。 Spring必须有一个选项来记录详细的所有数据库启动操作。 – 2015-10-23 21:34:25

+0

这是真的。真正的原因与jdbc无关。 – flower 2016-07-11 03:28:33

+0

这花费我几个小时!谢谢Yosi Lev – FuzZ63 2017-08-25 03:06:54