qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

数据库注册两种方式的比较

在学习JDBC的时候,通常有两种方式去注册数据库驱动程序(这里采用MySQL数据库),分别为:
DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
  那么这两种方式有什么异同呢?首先我们到DriverManager中去看一下,
public static synchronized void registerDriver(java.sql.Driver driver)
throws SQLException {
if (!initialized) {
initialize();
}
DriverInfo di = new DriverInfo();
di.driver = driver;
di.driverClass = driver.getClass();
di.driverClassName = di.driverClass.getName();
// Not Required -- drivers.addElement(di);
writeDrivers.addElement(di);
println("registerDriver: " + di);
/* update the read copy of drivers vector */
readDrivers = (java.util.Vector) writeDrivers.clone();
}
  很明显,DriverManager将我们需要注册的驱动程序信息封装成DriverInfo放进了一个writeDrivers中,这个writeDrivers是DriverManager中声明的一个static类型Vector变量。在getConnection的时候会再用到。
  那么Class.forName("com.mysql.jdbc.Driver")是如何注册驱动程序的呢,我们知道Class.forName("类名")的主要作用是向虚拟机实例化一个Class实例,我们看一下com.mysql.jdbc.Driver的源代码。
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
// ~ Static fields/initializers
// ---------------------------------------------
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
  在 com.mysql.jdbc.Driver中有一段静态代码块,是向 DriverManager注册一个Driver实例。这样在 Class.forName("com.mysql.jdbc.Driver")的时候,就会首先去执行这个静态代码块,于是和DriverManager.registerDriver(new Driver())有了相同的效果。
  那么对于这两种方法,在这里,我推荐使用第二种,即Class.forName("类名")的方式。原因有两点
  1、在我们执行DriverManager.registerDriver(new Driver())的时候,静态代码块也已经执行了,相当于是实例化了两个Driver对象。
  2、 DriverManager.registerDriver(new Driver())产生了一种对MySQL的一种依赖。而Class.forName的方式我们完全可以在运行的时候再动态改变。

posted on 2013-12-23 09:39 顺其自然EVO 阅读(240) 评论(0)  编辑  收藏 所属分类: 数据库


只有注册用户登录后才能发表评论。


网站导航:
 
<2013年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜