2011-04-09 54 views
6

我的tomcat服務器5在CentOS運行頻繁(多次/天)產生以下錯誤:的Tomcat 6.0.24異常:無法加載com.mysql.jdbc.SQLError

Apr 7, 2011 11:02:30 PM org.apache.catalina.loader.WebappClassLoader loadClass 
INFO: Illegal access: this web application instance has been stopped already. Could not load com.mysql.jdbc.SQLError. 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:1370) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329) 
     at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3291) 
     at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1665) 
     at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4411) 
     at com.mysql.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1315) 
     at com.mysql.jdbc.ConnectionImpl.finalize(ConnectionImpl.java:2761) 
     at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) 
     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) 

Tomcat的lib目錄中包含的MySQL -connector-java-5.1.8-bin.jar和mysql-connector-java-5.1.6-bin.jar,而WEB-INF/lib目錄只包含mysql-connector-java-5.1.8-bin.jar 。所有三個jar文件都包含SQLError類。

我想消除此異常。 Tomcat可以找別的地方去找這個班嗎?

+2

不要在lib文件夾中保留相同的lib不同版本。嘗試保留最新的一個並刪除其他人並嘗試。 – Senthil 2011-04-09 20:30:00

+0

按照建議升級到建議的最新版本(5.1.15)mysql-connector並刪除所有舊版本。 我使用tomcat 6.0.24而不是5.對不起,關於錯字。 – user1621123 2011-04-10 19:06:04

回答

4

錯誤不是找不到類。它不被允許加載,因爲Web應用程序已停止。我懷疑這可能是在Web應用程序重新啓動之後發生的,它在很短的時間內關閉。然後在代碼中的一些finalize()方法可能試圖做一些清理太晚。無論是否在你的代碼或MySQL驅動程序,我不能說。你絕對應該一次只能在一個目錄中有一個jar版本。您可能想將其升級到latest(5.1.15現在),以防萬一有可能影響到您的事情被修復。

1

較新版本的Tomcat要求您將JDBC驅動程序JAR放入Tomcat/lib目錄中,而不是您的WEB-INF。並且該目錄中應該只有一個版本 - 您想使用的版本 - 而不是其他版本。

由於您使用的是Tomcat 5,我建議將JAR放入您的server/lib目錄中。

我不知道這是否是問題的根源,但值得一試。

+2

呃真的嗎?鏈接? – MJB 2011-05-06 04:07:49

0

您可以檢查類路徑中的目錄順序。我曾經有過兩個版本的jar文件:一個在工作目錄中,另一個在Java Extensions目錄中。類路徑的順序是:首先檢查eclipse擴展目錄,然後檢查工作目錄。一旦它在擴展目錄中找到了一個jar版本,它就不會繼續尋找我在工作目錄中指定的那個。訂單在類路徑中很重要。

0

您的JDBC連接池在哪裏配置?它是在Tomcat的JNDI(conf/server.xml)還是直接在你的應用程序中?出現此消息時,您的某個Web應用程序是否已取消部署/重新部署?

從MysqlIO.java和WebappClassLoader.java的堆棧跟蹤和源代碼我猜:取消部署

  • 的Web應用程序的一個 - 基於WebappClassLoader代碼:

    //日誌訪問停止類加載器

    if(!started){ try { throw new IllegalStateException(); (illegalStateException e){ log.info(sm.getString(「webappClassLoader.stopped」,name),e); }}

  • 您的JDBC連接不web應用程序關閉期間清理正確(您ServletContextListener.contextDestroyed應該這樣做或如Spring的bean的破壞,方法參數)

  • 一些被MySQL驅動程序代碼中使用的類的得到了由GC
  • 卸載這些連接GC資格當你的應用程序停機,但GC發現MySQL連接完成方法重寫,因此執行它
  • 當執行finalize方法時,它需要一個需要加載的類。 Tomcat的停止Web應用程序的類加載器會檢測到它並報告應該沒有其他類停止的Web應用程序加載。

我對你的問題的解決方案是檢查你的JDBC連接池在Web應用程序關閉期間如何清理並確保該池也被明確關閉。

0

你很可能是在你的應用程序正在檢查數據庫連接的usign連接池。

2

在WEB-INF/lib目錄中只使用一個版本的jar文件。最好使用最新版本的mysql-connector-java 5.1.26。

0

除此之外,請檢查下面還有:

  1. 確保當你完成了數據庫連接,關閉連接close()調用。
  2. 當您打開連接數並且沒有明確關閉它們時,可能會發生這樣的錯誤。
  3. 在這些情況下,數據庫實際上關閉了空閒連接,但表示應用程序端連接的對象仍未關閉。
  4. 會發生什麼,這些打開的連接對象是潛伏的,當終結器運行時(從堆棧跟蹤明顯)並嘗試關閉連接,您會得到IllegalStateException,因爲此連接對象不與任何數據庫連接關聯。