2016-03-02 78 views
6

我正在使用Spring与Hibernate应用程序,应用程序工作正常,但在启动或重新加载tomcat服务器时,出现java.lang.IllegalStateException异常。当重新加载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) 
+0

清理tomcat是因为缓存应用程序的旧版本。然后运行应用程序 –

+0

@BaskerAmmu如何清洁? –

回答

5

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

  1. Restart your tomcat and apache server因为长时间的使用,它会保留旧版本的应用程序。
  2. 清洁你的Tomcat temp目录和restart
  3. 为错误指出,

最终的以下堆栈跟踪被抛出 调试的目的,以及试图终止的错误造成的 导致非法访问的线程,并且没有功能影响。

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

  1. 如果您的代码包含任何类型的线程没有正确终止,则可能会发生此类型的错误。 你有init()方法,但没有destroy()方法,那么这种类型的错误可能会发生。有关详细信息,您可以按照链接 - http://www.javaspecialists.eu/archive/Issue056.html

  2. 如果webapp has stopped, or is stopping,这意味着,.war文件或WEB-INF/web.xml时间被改变,以及web应用程序可能会被重新加载。请检查时间戳是否正确。

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

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

解决办法很简单,只要在reloadable = "true" into false就行了tomcat的server.xml中,但这样做会失去热部署的优势,并为发展不是很方便,只需改变它。这个错误并不重要。

错误原则:

,就是因为tomcat的重启,因为以前的tomcat线程尚未完全关闭,重新启动Tomcat将报告该异常,但这并不影响正常使用,就直接跳到异常烦人的人。使用休眠,弹簧或其他大型组件,当一个WEB应用系统有很多类时,如果你转动了Tomcat reloadable = true,那么每当相关文档改变时,Tomcat停止web应用并释放内存,然后重新加载web应用程序。这可能是一个巨大的项目。所以我们总是认为如果只有某种类型的重载函数,会很大程度上满足我们的调试器。

更新:对于代码相关的问题

首先,我想告诉你,我已经给了你为Tomcat依据一些解决方案。现在我想给你一个代码基础的解决方案。你能否在这个问题上交叉检查你的代码?请按照网址。

  • http://www.coderanch.com/t/660126/Wiki/Illegal-State-Exception
  • UPDATE:对于MySQL相关的问题

  • 有2个问题。

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

    • 此Web应用程序实例已被 已停止。无法加载com.mysql.jdbc

  • 这是因为在WEB-INF/lib目录下的应用程序MySQL JDBC驱动程序,在其重新释放加载两次,只要它可以被复制到%TOMCAT_HOME%/lib可以解决问题。 我们可以解决这两个异常MySQL驱动从WEB-INF/lib文件夹移动到%TOMCAT_HOME%/lib

    1. 我怀疑这可能是在Web应用程序重新启动后发生的,它在很短的时间内关闭。然后在代码中的一些finalize()方法可能试图做一些清理太晚。无论是否在你的代码或MySQL驱动程序,我不能说。你绝对应该一次只能在一个目录中有一个jar版本。你可能想给它的东西的情况下已被固定,可能会影响您升级到latest(5.1.38现在)(9号是从@ WhiteFang34复制)

    相关链接9:tomcat 6.0.24 Exception: Could not load com.mysql.jdbc.SQLError

    +0

    我已经试过1,2,3,5,这些不是为我工作..和我没有在我的应用程序中使用任何线程..我也试过6,但我想重新加载我的应用程序时,改变... –

    +1

    @SantoshJadi我知道6是可怕的,但它的作品 – SkyWalker

    +1

    是的,它的作品,但有些什么是它的劣势;( –

    1

    问题出在服务器缓存。按照下面的步骤来解决这个问题

    1. 找到你的Tomcat的根目录
    2. 下称“工作”的目录中删除它完全
    3. 重新启动服务器

    问题将得到解决。

    注:如果您在Linux机器默认的Tomcat安装,您必须删除/var/cache/tomcat7/Catalina

    +0

    雅我做到了,但仍然即时获得相同.. –

    +0

    @SantoshJadi:尝试删除'/temp /'下的文件,然后重新启动。 – Thanga

    +0

    临时目录已经是空的 –

    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(); 
    

    到你的主线程可以在关机时执行的是固定的。

    +0

    im在我的应用程序中没有使用任何线程 –

    +0

    引用来自Oracle Java文档:“创建VM JNI_CreateJavaVM()函数加载并初始化Java VM并返回一个指向JNI接口指针的指针,调用JNI_CreateJavaVM()的线程是被认为是主线程“无论何时使用Java,您正在创建一个执行您分配给它的任务的虚拟机,然后终止。 –

    2

    我认为这个问题的根本原因在于JDBC Connection对象泄漏。

    这些对象实际上是com.mysql.jdbc.ConnectionImpl的实例...这是一个具有finalize()的类。通常情况下,对象完成整理泄漏的连接。在这种情况下,它看起来像事件的顺序如下:

    • 的GC运行Web应用程序已关闭后
    • 一个ConnectionImpl对象被认为是不可到达的
    • 对象的finalize()方法的尝试来关闭MySQL数据库连接......这需要将消息发送到服务器时发送消息由于某种原因失败
    • ,以及通讯科级代码试图通过调用com.mysql.jdbc.SQLError.createCommunicationsException
    • 试图创建创建例外反思的例外..

    最后一步是失败,因为它正在尝试使用webapp的classloader for webapp ...已关闭。显然,这是通过检查来检测的,该检查旨在帮助程序员诊断不会干净关闭的web应用程序。

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

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