【问题标题】:tomcat 6.0.24 Exception: Could not load com.mysql.jdbc.SQLErrortomcat 6.0.24 异常:无法加载 com.mysql.jdbc.SQLError
【发布时间】:2011-08-02 05:38:55
【问题描述】:

我的tomcat 5服务器在centos上运行频繁(每天几次)产生以下错误:

Apr 7, 2011 11:02:30 PM org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already.  Could not load com.mysql.jdbc.SQLError.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1370)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329)
        at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3291)
        at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1665)
        at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4411)
        at com.mysql.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1315)
        at com.mysql.jdbc.ConnectionImpl.finalize(ConnectionImpl.java:2761)
        at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
        at java.lang.ref.Finalizer.runFinalizer(Unknown Source)
        at java.lang.ref.Finalizer.access$100(Unknown Source)
        at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)

tomcat的lib目录包含mysql-connector-java-5.1.8-bin.jar和mysql-connector-java-5.1.6-bin.jar,而WEB-INF/lib目录只包含mysql-connector-java -5.1.8-bin.jar。所有三个 jar 文件都包含 SQLError 类。

我想消除这个异常。 tomcat 会在其他地方寻找这个类吗?

【问题讨论】:

  • 不要在 lib 文件夹中保留相同的 lib 不同版本。尝试保留最新的并删除其他并尝试。
  • 我已按照建议升级到 mysql-connector 的最新版本 (5.1.15),并删除了所有旧副本。我使用的是 tomcat 6.0.24 而不是 5。抱歉打错了。

标签: java mysql tomcat jdbc tomcat6


【解决方案1】:

错误不是找不到类。由于 Web 应用程序已停止,因此不允许加载。我怀疑这可能发生在 Web 应用程序重新启动后,它会在短时间内停止运行。然后代码中的一些finalize() 方法可能试图进行一些清理为时已晚。无论是在您的代码中还是在 MySQL 驱动程序中,我都不能说。您绝对应该一次在目录中只有一个版本的 jar。您可能需要将其升级到 latest(现在为 5.1.15),以防已修复可能影响您的问题。

【讨论】:

    【解决方案2】:

    仅使用WEB-INF/lib 目录中的一种版本的jar 文件。最好使用最新版本的mysql-connector-java 5.1.26

    【讨论】:

      【解决方案3】:

      较新版本的 Tomcat 要求您将 JDBC 驱动程序 JAR 放入 Tomcat /lib 目录,而不是您的 WEB-INF。并且该目录中应该只有一个版本 - 您要使用的版本 - 没有其他版本。

      由于您使用的是 Tomcat 5,我建议将 JAR 放在您的 server/lib 目录中。

      我不知道这是否是您问题的根本原因,但值得一试。

      【讨论】:

        【解决方案4】:

        您可以检查类路径中目录的顺序。我曾经有两个版本的 jar 文件:一个在工作目录中,另一个在 Java Extensions 目录中。类路径的顺序是:首先检查 eclipse 扩展目录,然后是工作目录。一旦它在扩展目录中找到了一个版本的 jar,它就不会继续寻找我在工作目录中指定的那个版本。类路径中的顺序很重要。

        【讨论】:

          【解决方案5】:

          您的 JDBC 连接池在哪里配置?它是在 Tomcat 的 JNDI (conf/server.xml) 中还是直接在您的应用程序中?当该消息出现时,您的某个网络应用程序是否已取消部署/重新部署?

          从 MysqlIO.java 和 WebappClassLoader.java 的堆栈跟踪和源代码我猜:

          • 其中一个 webapp 已取消部署 - 基于 WebappClassLoader 中的代码:

            // 记录对停止的类加载器的访问

            如果(!开始){ 尝试 { 抛出新的 IllegalStateException(); } 捕捉(IllegalStateException e){ log.info(sm.getString("webappClassLoader.stopped", name), e); } }

          • 您的 JDBC 连接在 Web 应用关闭期间未正确清理(您的 ServletContextListener.contextDestroyed 应该这样做,或者例如 Spring 的 bean destroy-method 参数)

          • MySQL 驱动程序代码使用的一些类被 GC 卸载了
          • 当您的应用程序关闭时,这些连接符合 GC 条件,但 GC 发现 MySQL 连接 finalize 方法被覆盖,因此它会执行它
          • 当执行该 finalize 方法时,它需要一个需要加载的类。已停止的 Web 应用的 Tomcat 类加载器会检测到它并报告已停止的 Web 应用不应加载其他类。

          我对您的问题的解决方案是检查您的 JDBC 连接池在 Web 应用关闭期间是如何清理的,并确保该池也被明确关闭。

          【讨论】:

            【解决方案6】:

            您很可能在检查数据库连接的应用程序中使用连接池。

            【讨论】:

              【解决方案7】:

              我认为您必须对空闲连接使用连接池机制。 或者检查此链接以获取连接池'http://www.mkyong.com/hibernate/how-to-configure-the-c3p0-connection-pool-in-hibernate/'

              【讨论】:

                【解决方案8】:

                除了只使用一个版本的jar(其他用户建议的)之外,请检查以下内容:

                1. 确保在完成数据库连接后,使用close() 调用关闭连接
                2. 当您打开多个连接但未明确关闭它们时,可能会发生此类错误。
                3. 在这些情况下,很多时候,数据库实际上关闭了空闲连接,但在应用程序端表示该连接的对象仍未关闭。
                4. 发生的情况是,这些打开的连接对象潜伏着,当终结器运行(从堆栈跟踪中可以看出)并尝试关闭连接时,您会得到IllegalStateException,因为这个连接对象是不与任何数据库连接相关联。

                【讨论】:

                  猜你喜欢
                  • 2013-12-19
                  • 1970-01-01
                  • 2014-05-05
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-10-24
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-10-12
                  相关资源
                  最近更新 更多