你的位置:首页 > Java教程

[Java教程]java.sql.SQLException: No suitable driver found for jdbc


  前几天在使用一些组件的时候遇到了这个报错: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类加载机制》