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