浏览 7198 次
锁定老帖子 主题:看深入JVM书的一点类初始化的疑惑
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-12
DriverManager类的静态方法注册的,所有jdbc驱动加载的时候必须要进行连接和初始化。这样才能使用驱动程序。否则将不能使用。 2.但是我又在书里看到了说,如果一个类被加载没有被连接和初始化,但当此类被主动使用的时候就会进行类的连接和初始化。什么情况时主动使用呢?其中调用一个类的静态方法就是之一。所以当使用DriverManager类的静态方法进行注册的时候应该就会初始化DriverManager类。 所有 对于第1点觉得很疑惑。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-12
初始化DriverManager类与初始化jdbc驱动,你恐怕混淆了这个
|
|
返回顶楼 | |
发表时间: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()方法。 |
|
返回顶楼 | |
发表时间:2007-04-12
dennis_zane 写道 初始化DriverManager类与初始化jdbc驱动,你恐怕混淆了这个
首先DriverManager是jdbc驱动jar包里的一个类,难道加载jdbc驱动jar的时候不加载DriverManager吗?如果有加载就算没有连接和初始化,那么当第一次调用的时候也会连接和初始化DriverManager类,对不对。 |
|
返回顶楼 | |
发表时间: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类所在的包就可以对不对! |
|
返回顶楼 | |
发表时间:2007-04-12
你到底对第一点的哪个地方没明白呢?
|
|
返回顶楼 | |
发表时间:2007-04-12
programmer 写道 dennis_zane 写道 初始化DriverManager类与初始化jdbc驱动,你恐怕混淆了这个
首先DriverManager是jdbc驱动jar包里的一个类,难道加载jdbc驱动jar的时候不加载DriverManager吗?如果有加载就算没有连接和初始化,那么当第一次调用的时候也会连接和初始化DriverManager类,对不对。 请看清楚了,DriverManager是java.sql包的类,数据库驱动(比如com.mysql.jdbc.Driver)与DriverManager是两个不同的概念,有点汗。 |
|
返回顶楼 | |
发表时间:2007-06-07
你去看看Class.forName的那个类的代码就知道,里面有个static{...}
|
|
返回顶楼 | |
发表时间: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);就可以了. |
|
返回顶楼 | |
发表时间:2007-06-07
JDBC驱动是通过Class.forName()加载的,这个时候并没有调用驱动的任何方法(包括静态方法),所以这个时候只是加载了驱动类,并没有建立连接和做初始化动作
|
|
返回顶楼 | |