数据库注册两种方式的比较
2013-12-19 09:14
344 查看
在学习JDBC的时候,通常有两种方式去注册数据库驱动程序(这里采用MySQL数据库),分别为:
Java代码
DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
那么这两种方式有什么异同呢?首先我们到DriverManager中去看一下,
Java代码
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的源代码。
Java代码
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的方式我们完全可以在运行的时候再动态改变。
Java代码
DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
那么这两种方式有什么异同呢?首先我们到DriverManager中去看一下,
Java代码
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的源代码。
Java代码
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的方式我们完全可以在运行的时候再动态改变。
相关文章推荐
- 实现数据库的批处理两种方式,以及比较其优缺点
- java数据库开发中两种注册oracle驱动的方式
- 百度文档中比较全面的各种数据库的连接方式
- springmvc 上传文件两种方式比较以及上传问题解决
- Jms两种message传输方式Topic和Queue的比较
- java链接数据库access两种方式
- Android注册广播两种方式区别
- BroadcastReceiver的两种注册方式(静态注册和动态注册)
- Jsp两种注释方式的比较。
- ASP web.config中配置数据库连接的两种方式
- 两种注册广播的方式及其优缺点
- JS连接两种数据库的方式
- SQL Server 2008 数据库同步的两种方式 (发布、订阅)
- AsyncTask和Handler两种异步方式的实现和区别比较
- web.config中配置数据库连接的两种方式
- Android开发中FPS游戏实现的两种方式比较
- 高并发网站更新数据库数据比较高效的方式
- asp.net中把有图片的execl导入到数据库(以二进制流的方式存放图片)中的两种方法
- Spring中IoC两种接口和两种依赖注入方式的比较
- 两种HTTP连接方式POST&GET的比较