JDBC4.0加载Driver

来源:互联网 发布:mac怎么删掉客人用户 编辑:程序博客网 时间:2024/06/04 19:25

在java中创建JDBC数据库连接,分为简单的四步:

1. 在代码中引入JDBC使用到的类,import java.sql.*;;

2. 注册JDBC驱动:由JVM加载相应的驱动类到内存中;

3. 组织URL信息;

4. DriverManger.getConnnection()创建连接。

不过在注册驱动时,有几种不同的做法:1).Class.forName("com.mysql.jdbc.Driver");2).Class.forName("com.mysql.jdbc.Driver").newInstance();3).DriverManager.registerDriver(new com.mysql.jdbc.Driver())。

在Java中,一个类只有在需要的时候才会被加载的,而JDBC的代码通常不会直接引用Driver的,所以只能在代码中通过上述三种方式主动加载。我一直很想知道前两种注册驱动的区别,其实是这样的,每一个数据库提供商实现的Driver都有一个static代码块,也就是在按照第一种方式加载某Driver时已经完成了必要的初始化操作。也就是说可以不再按第二种方式的.newInstance()也是可以的。但是现实中的程序多是用第二种方式,tutorialspoint中解释说这样做是为了让程序在一些不兼容的JVM中也能正常工作。

com.mysql.jdbc.Driver的static代码块:

static {    try {        java.sql.DriverManager.registerDriver(new Driver());    } catch (SQLException E) {        throw new RuntimeException("Can't register driver!");    }}

加载和初始化Driver的工作完成了,但是在创建数据库连接时,DriverManager并不知道我们需要的是哪一个驱动,因为JVM可能加载了不止mysql的一个驱动。在实现中,DriverManager通过遍历drivers数组(在内部为Vector类型),并分别调用每一个driver(已经被加载的)的acceptsURL(url),询问他们是否能处理这样的url,以此完成选择Driver的工作。

不过JDBC4.0推出已有些年头了,根据Java SE Service Provider机制Class.forName("com.mysql.jdbc.Driver")不再是必要的,并且对于已经这样做的旧代码,也可以不修改一行代码仍旧适用。新规范里,只要数据库提供商的JDBC jar包添加到classpath,而开发人员根本不需要知道需要的是哪一个Driver,并且做到了程序代码和Driver的名称完全无关。不过要这样做是有前提的,数据库提供商的JDBC jar包必须支持这样的新机制。具体而言就是,JDBC4.0 Driver jar包中必须包含META-INF/services/java.sql.Driver文件,这个文件里包含了提供商实现的新Driver类的全路径。

参考资料:

http://www.tutorialspoint.com/jdbc/jdbc-db-connections.htm

http://stackoverflow.com/questions/12933113/better-understaning-class-fornamecom-mysql-jdbc-driver-newinstance?rq=1

原创粉丝点击