前幾天在使用一些組件的時候遇到了這個報錯:java.sql.SQLException: No suitable driver found for jdbc:XXX,之後上網搜了一個方法解決了,可為什麼能如此解決則在這裡記錄一下:
一、網上搜索的解決方案
《No Suitable Driver Found For Jdbc_我的解決方法》
文中的解決辦法是在jre\lib\ext上添加驅動jar包,問題解決;
但是解釋就不是作者所說的需要把jar包放在外部jar包環境中。其根本原因是:程序沒有加載驅動jar包;
當程序沒有加載驅動包,就運行DriverManager.getConnection(url,usr,psd),就會報這個錯誤:
No suitable driver found for jdbc:XXX
這裡缺少了Class.forName()導致的,當我按照前面的解決辦法,把驅動包放在jre\lib\ext上的時候,同樣能夠解決問題:
顯然易見:出現No suitable driver found for jdbc這個報錯的原因是程序沒有加載驅動程序jar包,盡管在lib上已經包含了這個jar包。
二、關於類加載器
網上關於類加載器的資料:
類加載時采用的樹形的委托機制,默認有三個類加載器:
1、Bootstrap Class Loader:加載jre/lib/rt.jar;在樹的根節點
2、Extension Class Loader:加載jre/lib/ext/*.jar;
3、System Class Loader:加載classpath指定的jar或者目錄;
他們的加載順序是:先bootstrap加載,然後extension加載,最後system加載。
加載策略:向上委托策略,低級別類加載器(L)的要加載類,先由最高級別的類加載器先加載,若加載不成功則層層向下傳遞,直到該類加載器(L)也加載不了則報錯。
一篇關於JVM類加載機制的文章;
在本文中,Class.forName()的類加載器就是調用者的類加載器,總之,只要能把驅動jar包加載上去就可以解決問題了,無論在哪裡加載這個jar包。
三、參考資料
1、《No Suitable Driver Found For Jdbc_我的解決方法》
2、《No suitable driver found for jdbc:XXX》
3、《Java 如果將JAR文件放入jre/lib/ext目錄中,會遇到什麼麻煩?》
4、《JVM類加載機制》