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

San*_*adi 6 java spring tomcat illegalstateexception

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

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

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)

Sky*_*ker 6

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

  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时间戳已更改,并且webapp可能正在重新加载.请检查时间戳是否正常.

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

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

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

错误原则:

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

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

更新:与代码相关的问题

首先,我想告诉你,我已经为你提供了一些基于tomcat的解决方案.现在我想给你一个代码基础的解决方案.您能否在这个问题上交叉检查您的代码?请按照URL.

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

更新:与MySQL相关的问题

  1. 有2个问题.

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

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

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

  1. 我怀疑在重新启动Web应用程序之后可能会发生这种情况,因为它会在短时间内停止运行.然后finalize()代码中的某些方法可能试图进行一些清理太晚了.无论你的代码还是MySQL驱动程序中我都说不出来.你肯定一次只能在一个目录中有一个jar版本.您可能希望将其升级到最新版本(现在为5.1.38),以防修复可能影响您的内容.(编号9从@ WhiteFang34复制)

相关链接9: tomcat 6.0.24例外:无法加载com.mysql.jdbc.SQLError