【问题标题】:Mysql/j Connector Unloads Mysteriously Under Tomcat 6/JDK 6Tomcat 6/JDK 6下Mysql/j Connector神秘卸载
【发布时间】:2010-12-06 10:37:32
【问题描述】:

感谢您花时间看我的问题。

我正在开发一个 Java WAR 文件,旨在一次仅分发到一台服务器。到目前为止,我已经成功地在 3 台不同的服务器上进行了测试,一台是 Debian,一台是 Ubuntu,另一台是我正在开发的 Windows 机器。

在最终的部署服务器上,由于某种原因,应用程序部署良好,并且在每次启动时运行良好约 3 分钟。数据库连接正常,一切正常。然而 3 分钟后,每次应用程序尝试访问数据库时,我都开始看到 NoClassDefFoundError。

我是以下库,它们都打包在 WAR 文件中:

Mysql/j 连接器,最新版本 活动对象,0.8.2 加索 1.3 Jython 2.5.1(用于某些脚本) 雄猫 6.0.20 mod_python 阿帕奇

错误:

线程“Timer-4”中的异常 java.lang.NoClassDefFoundError: com/mysql/jdbc/SQLError 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:430) 在 com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:352) 在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:284) 在 java.sql.DriverManager.getConnection(DriverManager.java:582) 在 java.sql.DriverManager.getConnection(DriverManager.java:185) 在 net.java.ao.DatabaseProvider.getConnectionImpl(DatabaseProvider.java:771) 在 net.java.ao.DatabaseProvider.getConnection(DatabaseProvider.java:734) 在 net.java.ao.EntityManager.find(EntityManager.java:666) 在 net.java.ao.EntityManager.find(EntityManager.java:607) 在 net.java.ao.EntityManager.find(EntityManager.java:579) 在 com.sq.sa.SAPushAlertsTask.run(SAPushAlertsTask.java:32) 在 java.util.TimerThread.mainLoop(Timer.java:512) 在 java.util.TimerThread.run(Timer.java:462) 造成的: java.lang.ClassNotFoundException: com.mysql.jdbc.SQLError 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:138 7) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:123 3) 在 java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) ... 13 更多

【问题讨论】:

    标签: java mysql tomcat tomcat6 noclassdeffounderror


    【解决方案1】:

    要么您的 MySQL/J 连接器以某种方式损坏,要么(更有可能)您的类路径中有另一个 jar,其中只有 一些 MySQL 的 JDBC 驱动程序中的类。无论哪种方式,“com/mysql/jdbc/SQLError”类都找不到。

    您的应用程序在前几分钟运行良好,然后当发生一些错误时,无法加载上述类,这会引发发布的异常。检查你的整个类路径(CLASSPATH 环境变量 + tomcat 的 lib + webapp 的 lib),看看 a) 你是否确实有 SQLError,b) MySQL JDBC 驱动程序不会出现多次。

    一旦上述问题得到解决,您将得到一个导致此问题的实际错误,并且应该能够从那里得到它。

    【讨论】:

    • 感谢您的回复。我尝试从我的 WAR 文件中删除 mysql/j 连接器并将其移动到 tomcat/libs。这会产生一个更大的堆栈跟踪,希望会有用:pastie.org/653416 非常感谢!
    • “这个 Web 应用程序实例已经停止”消息非常可疑 - 你的 Web 应用程序真的被停止了吗(你可以在 tomcat 的管理器应用程序中检查)?如果是这样,为什么?那里显然存在一些类加载器问题;将 jdbc 从战争转移到 tomcat/libs 改变了行为的事实肯定表明了这一点。您的 CLASSPATH 包含什么(对于您启动 tomcat 的用户)?
    • 它变得更奇怪了 - 该应用程序甚至没有部署,并且 MySQL/j 连接器不在 tomcat/lib 目录中,但是堆栈跟踪来自上面的帖子不断被转储到 tomcat/logs/catalina.out。我的tomcat安装很糟糕吗?再次感谢您的帮助!
    • 您没有碰巧将任何 其他 应用部署到该 tomcat 实例,对吗?您是否正在热部署您的应用程序?至少出于故障排除的目的,我建议您安装新的 tomcat 实例,部署您的 WAR,然后使用 empty CLASSPATH 启动 tomcat(确保 JAVA_HOME / 路径也合适)。这至少会将可能的罪魁祸首限制在您的 webapp 的库中。要检查的另一件事是 jre/lib/ext - 确保那里没有恶意 jar。一旦你开始工作,你就可以看到你当前安装的 Tomcat 有什么不同。
    • 不,这假定是一个全新的 tomcat 安装(也没有部署其他应用程序)。我已经尝试了战争/爆炸战争、热加载/配置加载的所有组合......我猜有些东西很糟糕,所以我会尝试自己重新安装它并使用空的 CLASSPATH 运行。非常感谢您对 ChssPly76 的帮助。我会试试你的建议。
    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 2014-04-15
    • 1970-01-01
    • 2015-01-05
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多