由于 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驱动时总是提示找不到驱动类
Cloudbees、Tomcat 和 Spring:“无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序”