JDBC驱动加载原理

996 阅读1分钟

原文地址
老调重弹:JDBC系列 之 <驱动加载原理全面解析>

概述

一般情况下,在应用程序中进行数据库连接,调用JDBC接口,
首先要将特定厂商的JDBC驱动实现加载到系统内存中,然后供系统使用。基本结构图如下:

JDBC基本结构图

驱动加载入内存的过程

这里所谓的驱动,其实就是实现了java.sql.Driver接口的类。

  • 如oracle的驱动类是 oracle.jdbc.driver.OracleDriver.class
    (此类可以在oracle提供的JDBC jar包中找到),
    此类实现了java.sql.Driver接口。

由于驱动本质上还是一个class,将驱动加载到内存和加载普通的class原理是一样的:

  • 使用Class.forName("driverName")。

以下是将常用的数据库驱动加载到内存中的代码:

//加载Oracle数据库驱动
Class.forName("oracle.jdbc.driver.OracleDriver");

//加载SQL Server数据库驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

//加载MySQL 数据库驱动
Class.forName("com.mysql.jdbc.Driver");

注意:
Class.forName()将对应的驱动类加载到内存中,然后执行内存中的static静态代码段,代码段中,
会创建一个驱动Driver的实例,放入DriverManager中,供DriverManager使用。

例如,在使用Class.forName() 加载oracle的驱动oracle.jdbc.driver.OracleDriver时,会执行OracleDriver中的静态代码段,创建一个OracleDriver实例,然后调用DriverManager.registerDriver()注册:

static {
Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
try {
	if (defaultDriver == null) {
		//创建一个OracleDriver实例,然后注册到DriverManager中
                        defaultDriver = new OracleDriver();
		DriverManager.registerDriver(defaultDriver);
	}
} catch (RuntimeException localRuntimeException) {
} catch (SQLException localSQLException) {
}

Driver的功能