老调重弹:JDBC系列之<驱动加载原理全面解析)(四)

2014-11-24 10:57:20 · 作者: · 浏览: 2

1. 首先是将 oracle.jdbc.driver.OracleDriver加载到内存中;

2. 然后便调用DriverManager.getDriver()去取Driver实例;

3. 将driver实例从DriverManager中注销掉;

4.尝试再取 对应url的Driver实例;

上述代码执行的结果如下:

\

从执行结果看,正好能够验证以上论述:当第四步再次获取对应url的 Driver 实例时,由于已经被注销掉了,找不到适当的驱动Driver,抛出了 "Not suitable driver" 的异常。

将上述的例子稍作变化,在注销掉了静态块创建的driver后,往DriverManager注册一个自己创建的Driver对象实例(具体步骤请看注释):

	public static void defaultDriver(){
		try {
			
			String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
			
			//1.将Driver加载到内存中,然后执行其static静态代码,创建一个OracleDriver实例注册到DriverManager中
			Driver dd = (Driver)Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
			//2.取出对应的oracle 驱动Driver
			Driver driver  = DriverManager.getDriver(url);
			System.out.println("加载类后,获取Driver对象:"+driver);
			
			//3. 将driver从DriverManager中注销掉
			DriverManager.deregisterDriver(driver);
			
			//4.此时DriverManager中已经没有了驱动Driver实例,将创建的dd注册到DriverManager中
			DriverManager.registerDriver(dd);
			
			//5.重新通过url从DriverManager中取Driver
			driver  = DriverManager.getDriver(url);
                       
                        System.out.println("注销掉静态创建的Driver后,重新注册的Driver:    "+driver);
			System.out.println("driver和dd是否是同一对象:" +(driver==dd));
		} catch (Exception e) {
			System.out.println("加载Oracle类失败!");
			e.printStackTrace();
		} finally{
			
		}
	}
以下代码运行的结果:

\

以上代码先创建了一个Driver对象,在注销了DriverManager中由加载驱动过程中静态创建驱动之后,注册到系统中,现在DriverManager中对应url返回的Driver 即是在代码中创建的Driver对象。

使用DriverManager创建 Connection 连接对象

创建 Connection 连接对象,可以使用驱动Driver的 connect(url,props),也可以使用 DriverManager 提供的getConnection()方法,此方法通过url自动匹配对应的驱动Driver实例,然后调用对应的connect方法返回Connection对象实例。

Driver driver  = DriverManager.getDriver(url);
			Connection connection = driver.connect(url, props);
上述代码等价于:
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection connection = DriverManager.getConnection(url, props);

jdbc.drivers

DriverManager 作为 Driver 的管理器,它在第一次被使用的过程中(即在代码中第一次用到的时候),它会被加载到内存中,然后执行其定义的static静态代码段,在静态代码段中,有一个 loadInitialDrivers() 静态方法,用于加载配置在jdbc.drivers 系统属性内的驱动Driver,配置在jdbc.drivers 中的驱动driver将会首先被加载:

	static {
		loadInitialDrivers();//加载配置在jdbc.drivers系统变量中的驱动driver
		println("JDBC DriverManager initialized");
		SET_LOG_PERMISSION = new SQLPermission("setLog");
	}
	private static void loadInitialDrivers() {
		String str1;
		try {
			str1 = (String) AccessController
					.doPrivileged(new PrivilegedAction() {
						public String run() {
							return System.getProperty("jdbc.drivers");//返回jdbc.drivers值
						}
					});
		} catch (Exception localException1) {
			str1 = null;
		}

                //省略部分代码......
		if ((str1 == null) || (str1.equals("")))
			return;
		String[] arrayOfString1 = str1.split(":");
		println("number of Drivers:" + arrayOfString1.length);
		for (String str2 : arrayOfString1)
			try {
				//Class.forName加载对应的driver
				Class.forName(str2, true, ClassLoader.getSystemClassLoader());
			} catch (Exception localException2) {
				println("DriverManager.Initialize: load failed: "
						+ localException2);
			}
	}

以下是通过jdbc.drivers加载驱动driver的方式:

			String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
			//设置值系统变量jdbc.drivers
			System.set