2016-03-02 77 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的回答中所述。