原文:http://www.cnblogs.com/gaojing/archive/2012/03/23/2413638.html

传统的使用jdbc来访问数据库的流程为:

Class.forName(“com.mysql.jdbc.Driver”);

String url = “jdbc:mysql://localhost:3306/test?user=root&password=123456″;

Connection con = DriverManager.getConnection(url);

Statement statement = con.createStatement();

最开始使用的时候,不明白为什么首先要加载一个驱动类,之后就可以取得了Connection了,很好奇DriverManager是怎么获得那个驱动类的信息,后来看了下com.mysql.jdbc.Driver这个类的源代码,豁然开朗了。原来在com.mysql.jdbc.Driver类中有这么一段静态初始化代码:

static {

   try {

     java.sql.DriverManager.registerDriver(new Driver());

  } catch (SQLException E) {

    throw new RuntimeException(“Can’t register driver!”);

  }

}

也就是,在Class.forName加载完驱动类,开始执行静态初始化代码时,会自动新建一个Driver的对象,并调用DriverManager.registerDriver把自己注册到DriverManager中去。

ps1: Class.forName(String) 与ClassLoader.loadClass(String)的区别

Class.forName(String): 加载类,并且执行类初始化;可以通过Class.forName(String, boolean, ClassLoader)第二个参数来仅仅加载类不执行初始化; ClassLoader.loadClass(String): 仅仅加载类,不执行类初始化;

ps2: 有时会看到这种用法: Class.forName(“com.mysql.jdbc.Driver”).newInstance();

这是没有必要的,正如前述,静态初始化已经new了一个Driver的对象,注册到DriverManager中去,在此再建立一个Driver对象则是完全没有必要的,浪费空间。

ps3: 结合ps1,Class.forName(“com.mysql.jdbc.Driver”);

相当于: ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class cls = loader.loadClass(“com.mysql.jdbc.Driver”); cls.newInstance(); 这种方法的问题同ps2, 浪费了一个Driver对象;

ps4: 在java 6中,引入了service provider的概念,即可以在配置文件中配置service(可能是一个interface或者abstract class)的provider(即service的实现类)。

配置路径是:/META-INF/services/下面。详细信息见:http://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html#Service%20Provider

而java.sql.DriverManager也添加了对此的支持,因此,在JDK6中,DriverManager的查找Driver的范围为:

  1)system property “jdbc.drivers” 中配置的Driver值;

  2)用户调用Class.forName()注册的Driver

   3)service provider配置文件java.sql.Driver中配置的Driver值。

   因此,在jdk6中,其实是可以不用调用Class.forName来加载mysql驱动的,因为mysql的驱动程序jar包中已经包含了java.sql.Driver配置文件,并在文件中添加了com.mysql.jdbc.Driver.但在JDK6之前版本,还是要调用这个方法。

参考文档: 1)http://docs.oracle.com/javase/1.5.0/docs/api/java/sql/DriverManager.html 2)http://docs.oracle.com/javase/6/docs/api/index.html?java/sql/DriverManager.html 3)http://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html#Service%20Provider

最新文章

  1. EntityFramework 7 Left Join Where Select 奇怪问题
  2. DbEntry.Net.v3.5 快速教程
  3. winform控件
  4. Windows下使用AutoSSH,并作为服务自启动(不用安装Cygwin)
  5. hdu 1863 - 畅通工程(MST)
  6. 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理
  7. Android数据存储之sharedpreferences与Content Provider
  8. c++ IO的继承结构
  9. Cocos2d-x开发实例介绍帧动画使用
  10. BZOJ3166: [Heoi2013]Alo
  11. 如果你不好好玩printf
  12. SuperSocket源码解析之配置系统
  13. malloc一次性最大能申请多大内存空间
  14. Ios 该图显示其出现的相关问题定义UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
  15. Servlet 异步处理
  16. TCollector
  17. kernel笔记——网络收发包流程
  18. oracle sql优化的几种方法
  19. Structured Streaming教程(1) —— 基本概念与使用
  20. web前端面试题HTML/CSS部分

热门文章

  1. java学习之 反射
  2. Android之drawable state各个属性详解
  3. Eclipse 工程Clear与build的作用
  4. hadoop如何处理长时间运行不完成的map/reduce 任务?
  5. 创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
  6. Java Web之会话技术
  7. jdk8-日期
  8. [No000064]python 变量命名规范
  9. javascript里面foreach遍历函数介绍,以及跟jquery里面each的区别
  10. CSS语法