重新加载Tomcat时出现java.lang.IllegalStateException

时间:2016-03-02 06:02:45

标签: java spring tomcat illegalstateexception

我正在使用Hibernate应用程序处理Spring,它工作正常但在启动或重新加载tomcat服务器时,我得到java.lang.IllegalStateException例外。

任何人都可以解释,为什么会发生这种异常以及如何解决它?

INFO: Illegal access: this web application instance has been stopped already. Could not load java.net.BindException. 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:1600) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) at com.mysql.jdbc.SQLError.createLinkFailureMessageBasedOnHeuristics(SQLError.java:1220) at com.mysql.jdbc.exceptions.jdbc4.CommunicationsException.<init>(CommunicationsException.java:57) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3270) at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1659) at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4296) at com.mysql.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1265) at com.mysql.jdbc.ConnectionImpl.finalize(ConnectionImpl.java:2667) at java.lang.System$2.invokeFinalize(Unknown Source) at java.lang.ref.Finalizer.runFinalizer(Unknown Source) at java.lang.ref.Finalizer.access$100(Unknown Source)

4 个答案:

答案 0 :(得分:6)

我想给你几个选择。你可以尝试一下。任何选项都可以满足您的需求。

  1. Restart your tomcat and apache server因为长时间使用, 它保留了旧版本的应用程序。
  2. 清理tomcat temp目录和restart
  3. 如错误所述
  4.   

    最终跟随堆栈跟踪是由抛出的错误引起的   调试目的以及尝试终止哪个线程   导致非法访问,并没有任何功能影响。

    这可能是真正的原因,此时您处于调试模式并且它不会清除正在运行的线程。所以删除你的断点并运行它而不是调试

    1. 如果您的代码包含任何未正确终止的线程,则可能会发生此类错误。 如果您使用init()方法但没有destroy()方法,则可能会出现此类错误。有关详情,请点击链接 - http://www.javaspecialists.eu/archive/Issue056.html

    2. 如果webapp has stopped, or is stopping,则表示.war文件或WEB-INF/web.xml时间戳已更改,并且webapp可能正在重新加载。请检查时间戳是否正常。

    3. 要关闭它,在上下文定义中设置reloadable =“false” 你的应用。它可能是tomcat的server.xml。 详细解决方案: 可重新加载的Context的tomcat的server.xml设置为false。 例如:

    4. Context path="/expert" docBase="expert" debug="0" reloadable ="false"/>
      

      解决方案很简单,只要tomcat的reloadable = "true" into false中的server.xml就行,但这样做会失去热部署的优势,而且开发不是很方便,只需更改它或不。这个错误无关紧要。

      错误原则:

      原因是因为tomcat重启,因为以前的tomcat线程还没有完全关闭,重启tomcat会报告这个异常,但这并不影响正常使用,只是跳异常烦人。使用hibernate,spring或其他大型组件,当WEB应用程序系统有很多类时,

      如果您关闭了Tomcat reloadable = true,那么只要相关文档发生更改,Tomcat就会停止Web应用并释放内存,然后重新加载Web应用。这可能是一个巨大的项目。所以我们总是认为如果只有一类重载函数,将极大地满足我们的调试器。

        

      更新:与代码相关的问题

      首先,我想告诉你,我已经为你提供了一些基于tomcat的解决方案。现在我想为您提供基于代码的解决方案。您能否在这个问题上交叉检查您的代码?请关注网址。

      1. http://www.coderanch.com/t/660126/Wiki/Illegal-State-Exception
      2.   

        更新:对于MySQL相关问题

        1. 有两个问题。

          • 此Web应用程序实例已停止。无法加载java.net.BindException

          • 这个Web应用程序实例已经存在 已经停止。无法加载com.mysql.jdbc

        2. 这是因为WEB-INF/lib目录下的应用程序上的 MySQL JDBC驱动程序,在其加载的两次重新发布中,只要它可以复制到{{1可以解决问题。 我们可以将%TOMCAT_HOME%/lib文件夹中的这两个异常MySQL驱动程序移到WEB-INF/lib

          1. 我怀疑在重新启动Web应用程序后可能会发生这种情况,并且它会在短时间内停止运行。然后代码中的一些%TOMCAT_HOME%/lib方法可能试图进行一些清理太晚了。无论你的代码还是MySQL驱动程序中我都说不出来。你肯定一次只能在一个目录中有一个jar版本。您可能希望将其升级到latest(现在为5.1.38),以防修复可能影响您的内容。(编号9从@ WhiteFang34复制)
          2. 9的相关链接: tomcat 6.0.24 Exception: Could not load com.mysql.jdbc.SQLError

答案 1 :(得分:2)

我认为这个问题的根本原因是某些东西正在泄漏JDBC Connection个对象。

这些对象实际上是com.mysql.jdbc.ConnectionImpl的实例...这是一个finalize()的类。通常,对象终结可以整理泄漏的连接。在这种情况下,事件序列如下所示:

  • 在webapp关闭后运行GC
  • 发现ConnectionImpl对象无法访问
  • 对象的finalize()方法尝试关闭MySQL数据库连接...这需要向服务器发送消息
  • 当邮件发送由于某种原因失败时,并且通信级别代码尝试通过调用com.mysql.jdbc.SQLError.createCommunicationsException
  • 来创建例外
  • 试图反思地创建一个例外......

最后一步失败了,因为它试图使用webapp的类加载器来关闭webapp ...显然,这可以通过检查来检测,该检查旨在帮助程序员诊断未完全关闭的Web应用程序。

最佳解决方案是追踪Connection泄漏的来源并进行修复。如果Connection个对象没有泄漏,那么当webapp的类加载器仍处于活动状态时它们将被关闭。

或者,您可以简单地关闭支票,如@ Skywalker的回答中所述。

答案 2 :(得分:1)

问题是因为服务器缓存。请按照以下步骤解决此问题

  1. 在tomcat的根目录下找到名为“work”的目录
  2. 完全删除
  3. 重新启动服务器
  4. 问题将得到解决。

    注意:如果您在linux机器上安装了默认的tomcat,则必须删除文件夹/var/cache/tomcat7/Catalina

答案 3 :(得分:1)

问题可能是一个简单的SQL错误。 t工厂

java.lang.IllegalStateException

表示在未准备好调用对象或类时调用它。堆栈底部的这些错误

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)

看起来他们来自Java Garbage Collector 试图清理MySQL Object Pointers 在重新启动期间暂时未引用的内容。在我看来,这里的错误只是一些MySQL对象指针在执行过程中停止,当GC调用它们的finalize方法然后暂停应用程序以尝试清理对象时。 (导致失败和抛出此异常) 这个错误很可能是无害的,可以通过添加

来修复
JNI_DestroyJavaVM();

到关闭时执行的主线程。