论坛首页 Java企业应用论坛

看深入JVM书的一点类初始化的疑惑

浏览 7167 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-12  
OO
1.在书里我看到了说如果jdbc驱动被虚拟机加载了,但没有被连接和初始化,但是使用驱动程序的时候是通过
DriverManager类的静态方法注册的,所有jdbc驱动加载的时候必须要进行连接和初始化。这样才能使用驱动程序。否则将不能使用。
2.但是我又在书里看到了说,如果一个类被加载没有被连接和初始化,但当此类被主动使用的时候就会进行类的连接和初始化。什么情况时主动使用呢?其中调用一个类的静态方法就是之一。所以当使用DriverManager类的静态方法进行注册的时候应该就会初始化DriverManager类。
所有 对于第1点觉得很疑惑。


   发表时间:2007-04-12  
初始化DriverManager类与初始化jdbc驱动,你恐怕混淆了这个
0 请登录后投票
   发表时间:2007-04-12  
通过Class.forName()是用来加载JDBC驱动类的,注意 ,只是加载,并没有初始化。你可以看一下我的那个类加载器的帖子。
DriverManager类看了一下,最终会调用下面这个方法
 private static void loadInitialDrivers() {
        String drivers;
        try {
	    drivers = (String) java.security.AccessController.doPrivileged(
		new sun.security.action.GetPropertyAction("jdbc.drivers"));
        } catch (Exception ex) {
            drivers = null;
        }
        println("DriverManager.initialize: jdbc.drivers = " + drivers);
        if (drivers == null) {
            return;
        }
        while (drivers.length() != 0) {
            int x = drivers.indexOf(':');
            String driver;
            if (x < 0) {
                driver = drivers;
                drivers = "";
            } else {
                driver = drivers.substring(0, x);
                drivers = drivers.substring(x+1);
            }
            if (driver.length() == 0) {
                continue;
            }
            try {
                println("DriverManager.Initialize: loading " + driver);
                Class.forName(driver, true,
			      ClassLoader.getSystemClassLoader());
            } catch (Exception ex) {
                println("DriverManager.Initialize: load failed: " + ex);
            }
        }
    }

可以看到,最后也是通过DriverManager来初始化驱动,也是通过Class.forName()方法。
0 请登录后投票
   发表时间:2007-04-12  
dennis_zane 写道
初始化DriverManager类与初始化jdbc驱动,你恐怕混淆了这个

首先DriverManager是jdbc驱动jar包里的一个类,难道加载jdbc驱动jar的时候不加载DriverManager吗?如果有加载就算没有连接和初始化,那么当第一次调用的时候也会连接和初始化DriverManager类,对不对。
0 请登录后投票
   发表时间:2007-04-12  
rainlife 写道
通过Class.forName()是用来加载JDBC驱动类的,注意 ,只是加载,并没有初始化。你可以看一下我的那个类加载器的帖子。
DriverManager类看了一下,最终会调用下面这个方法
 private static void loadInitialDrivers() {
        String drivers;
        try {
	    drivers = (String) java.security.AccessController.doPrivileged(
		new sun.security.action.GetPropertyAction("jdbc.drivers"));
        } catch (Exception ex) {
            drivers = null;
        }
        println("DriverManager.initialize: jdbc.drivers = " + drivers);
        if (drivers == null) {
            return;
        }
        while (drivers.length() != 0) {
            int x = drivers.indexOf(':');
            String driver;
            if (x < 0) {
                driver = drivers;
                drivers = "";
            } else {
                driver = drivers.substring(0, x);
                drivers = drivers.substring(x+1);
            }
            if (driver.length() == 0) {
                continue;
            }
            try {
                println("DriverManager.Initialize: loading " + driver);
                Class.forName(driver, true,
			      ClassLoader.getSystemClassLoader());
            } catch (Exception ex) {
                println("DriverManager.Initialize: load failed: " + ex);
            }
        }
    }

可以看到,最后也是通过DriverManager来初始化驱动,也是通过Class.forName()方法。

DriverManager类怎么初始化我们不用管,按道理来说只要加载DriverManager类所在的包就可以对不对!
0 请登录后投票
   发表时间:2007-04-12  
你到底对第一点的哪个地方没明白呢?
0 请登录后投票
   发表时间:2007-04-12  
programmer 写道
dennis_zane 写道
初始化DriverManager类与初始化jdbc驱动,你恐怕混淆了这个

首先DriverManager是jdbc驱动jar包里的一个类,难道加载jdbc驱动jar的时候不加载DriverManager吗?如果有加载就算没有连接和初始化,那么当第一次调用的时候也会连接和初始化DriverManager类,对不对。


请看清楚了,DriverManager是java.sql包的类,数据库驱动(比如com.mysql.jdbc.Driver)与DriverManager是两个不同的概念,有点汗。
0 请登录后投票
   发表时间:2007-06-07  
你去看看Class.forName的那个类的代码就知道,里面有个static{...}
0 请登录后投票
   发表时间:2007-06-07  
Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段.在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的Driver类的代码都必须类似如下:
public class MyJDBCDriver implements Driver {
static {
DriverManager.registerDriver(new MyJDBCDriver());
}
}

所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了.
0 请登录后投票
   发表时间:2007-06-07  
JDBC驱动是通过Class.forName()加载的,这个时候并没有调用驱动的任何方法(包括静态方法),所以这个时候只是加载了驱动类,并没有建立连接和做初始化动作
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics