我正在使用Hibernate应用程序处理Spring,它工作正常,但在启动或重新加载tomcat服务器时,我收到了java.lang.IllegalStateException异常.
任何人都可以解释一下,为什么会发生这种异常以及如何解决它?
信息:非法访问:此Web应用程序实例已被停止.无法加载java.net.BindException.最终跟随堆栈跟踪是由于为调试目的而抛出的错误以及尝试终止导致非法访问的线程引起的,并且没有功能影响.
java.lang.IllegalStateException
在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600)
在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
在com.MysqL.jdbc.sqlError.createLinkFailureMessageBasedOnHeuristics(sqlError.java:1220)
在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)
在com.MysqL.jdbc.Util.handleNewInstance(Util.java:406)
at com.MysqL.jdbc.sqlError.createCommunicationsException(sqlError.java:1074)
在com.MysqL.jdbc.MysqLIO.send(MysqLIO.java:3270)
在com.MysqL.jdbc.MysqLIO.quit(MysqLIO.java:1659)
在com.MysqL.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4296)
在com.MysqL.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1265)
在com.MysqL.jdbc.ConnectionImpl.finalize(ConnectionImpl.java:2667)
at java.lang.System $2.invokeFinalize(Unknown Source)
在java.lang.ref.Finalizer.runFinalizer(未知来源)
at java.lang.ref.Finalizer.access $100(未知来源)
>重新启动tomcat和apache服务器因为使用时间长,
它保留了旧版本的应用程序.
>清理tomcat临时目录并重新启动
>如错误所述,
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.
这可能是真正的原因,此时您处于调试模式并且它不会清除正在运行的线程.所以删除你的断点并运行它而不是调试
>如果您的代码包含任何未正确终止的线程,则可能会发生此类错误.
你有init()方法但没有destroy()方法,那么可能会发生这种类型的错误.有关详细信息,请访问链接 – http://www.javaspecialists.eu/archive/Issue056.html
>如果webapp已停止或正在停止,则表示.war文件或WEB-INF / web.xml时间戳已更改,并且webapp可能正在重新加载.请检查时间戳是否正常.
>要将其关闭,请在上下文定义中设置reloadable =“false”
你的应用.它可能是tomcat的server.xml.
详细解决方案:
可重新加载的Context的tomcat的server.xml设置为false.
例如:
Context path="/expert" docBase="expert" debug="0" reloadable ="false"/>
解决方案很简单,只要将tomcat的server.xml中的reloadable =“true”变为false就行,但这样做会失去热部署的优势,而且开发不是很方便,只需更改或者不.这个错误无关紧要.
错误原则:
原因是因为tomcat重启,因为以前的tomcat线程还没有完全关闭,重启tomcat会报告这个异常,但这并不影响正常使用,只是跳异常烦人.使用hibernate,spring或其他大型组件,当WEB应用程序系统有很多类时,
如果您将Tomcat reloadable = true,那么只要相关文档发生更改,Tomcat就会停止Web应用并释放内存,然后重新加载Web应用.这可能是一个巨大的项目.所以我们总是认为如果只有某类重载函数,将极大地满足我们的调试器.
UPDATE: For code related issue
首先,我想告诉你,我已经为你提供了一些基于tomcat的解决方案.现在我想给你一个代码基础的解决方案.您能否在这个问题上交叉检查您的代码?请按照URL.
> http://www.coderanch.com/t/660126/Wiki/Illegal-State-Exception
UPDATE: For MysqL related issue
>有2个问题.
>此Web应用程序实例已经停止.无法加载java.net.BindException.
>这个Web应用程序实例已经
已经停止.无法加载com.MysqL.jdbc.
这是因为MysqL JDBC驱动程序在WEB-INF / lib目录下的应用程序中,在其重新发布时加载了两次,只要它可以复制到%TOMCAT_HOME%/ lib就可以解决问题.
我们可以解决这两个异常问题,将MysqL驱动程序从WEB-INF / lib文件夹移到%TOMCAT_HOME%/ lib.
>我怀疑在重新启动Web应用程序之后可能会发生这种情况,因为它会在短时间内停止运行.然后代码中的一些finalize()方法可能试图进行一些清理太晚了.无论你的代码还是MysqL驱动程序中我都说不出来.你肯定一次只能在一个目录中有一个jar版本.您可能希望将其升级到latest(现在为5.1.38),以防修复可能影响您的内容.(编号9从@ WhiteFang34复制)
相关链接9:tomcat 6.0.24 Exception: Could not load com.mysql.jdbc.SQLError