`
macrox
  • 浏览: 5658 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC Driver的加载机制

    博客分类:
  • JDK
 
阅读更多

JDBC Driver的加载机制

1.用以下代码取得url里对应的Connection

 

Connection conn = DriverManager.getConnection(url, user, password);

 

2.进一步查看源代码,可以发现是通过遍历DriverManager里的 DriverInfo来尝试加载url对应的Connection的。那么问题就是,遍历的这些DriverInfo是哪里来的,它在DriverManager里是一个Vector。遍历代码如下:

 

if (!initialized) {
	    initialize();
	}

	synchronized (DriverManager.class){ 
            // use the readcopy of drivers
	    drivers = readDrivers;  
        }

	// Walk through the loaded drivers attempting to make a connection.
	// Remember the first exception that gets raised so we can reraise it.
	SQLException reason = null;
for (int i = 0; i < drivers.size(); i++) {
	    DriverInfo di = (DriverInfo)drivers.elementAt(i);
      
	    // If the caller does not have permission to load the driver then 
	    // skip it.
	    if ( getCallerClass(callerCL, di.driverClassName ) != di.driverClass ) {
		println("    skipping: " + di);
		continue;
	    }
	    try {
		println("    trying " + di);
		Connection result = di.driver.connect(url, info);
		if (result != null) {
		    // Success!
		    println("getConnection returning " + di);
		    return (result);
		}
	    } catch (SQLException ex) {
		if (reason == null) {
		    reason = ex;
		}
	    }
	}

 3.上面的 initialize();就是问题的关键。进一步阅读源代码,进入loadInitialDrivers()方法。

 

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;
        }
        
        // If the driver is packaged as a Service Provider,
        // load it.
        
        // Get all the drivers through the classloader 
        // exposed as a java.sql.Driver.class service.
	
	 DriverService ds = new DriverService();

	 // Have all the privileges to get all the 
	 // implementation of java.sql.Driver
	 java.security.AccessController.doPrivileged(ds);		
	        
         println("DriverManager.initialize: jdbc.drivers = " + drivers);
        if (drivers == null) {
            return;
        }

4.这里的DriverService起到了加载驱动的作用,进入DriverService的定义:

 

class DriverService implements java.security.PrivilegedAction {
        Iterator ps = null;
	public DriverService() {};
        public Object run() {
	ps = Service.providers(java.sql.Driver.class);
	
	try {
           while (ps.hasNext()) {
               ps.next();
           } // end while
	} catch(Throwable t) {
	    // Do nothing
	}
        return null;
    } //end run

} 

5.(3)里的 java.security.AccessController.doPrivileged(ds);会调用ds的run方法,也就是DriverService的run方法。run方法里ps = Service.providers(java.sql.Driver.class);这一句,会遍历整个classpath上的jar包,包的META-INF/services里有一个文件名为java.sql.Driver的文件,里面记录了这个包里继承了java.sql.Driver的类的类名,执行ps.next();则会加载对应的类。

 

 

分享到:
评论

相关推荐

    Microsoft JDBC Driver 4.0 for SQL Server

    1. `sqljdbc_4.0.2206.100_chs.exe` 是Windows环境下的安装程序,用户可以通过执行这个文件将驱动添加到系统路径,方便在Java应用中自动发现和加载。 2. `sqljdbc_4.0.2206.100_chs.tar.gz` 是适用于Linux和Unix等...

    JDBC Driver 4.0 for SQL Server

    6. **安全性**:JDBC Driver 4.0提供集成的身份验证机制,包括Windows身份验证(Kerberos)、集成安全性以及SQL Server的其他安全特性,确保数据访问的安全。 7. **兼容性**:除了SQL Server 2005及更高版本,该...

    Microsoft SQL Server 2005 JDBC Driver

    Microsoft SQL Server 2005 JDBC Driver是一款由微软公司开发的Java数据库连接(JDBC)驱动程序,专门用于Java应用程序与Microsoft SQL Server 2005数据库之间的通信。这款驱动程序实现了Java Database Connectivity...

    JDBC驱动加载分析

    本文将深入分析JDBC驱动的加载机制,特别是sun提供的JDBC-ODBC桥接驱动的加载过程。 #### JDBC驱动加载原理 JDBC驱动加载是一个关键步骤,它决定了Java应用程序能否成功地与数据库建立连接。在本例中,我们将探讨...

    数据库jdbc驱动加载过程

    JDBC 4.0 版本引入了 Java SPI 机制来加载驱动程序,使用 ServiceLoader 机制来加载驱动程序,并将其注册到 DriverManager 中。这样,应用程序就可以使用 JDBC 驱动程序来连接到数据库并进行数据交互。

    GBase-8s数据库JDBC Driver程序员指南.pdf

    ### GBase-8s数据库JDBC Driver程序员指南关键知识点概览 #### 1. 概述 - **GBase-8s JDBC Driver**:由南大通用数据技术股份有限公司开发,是一款用于连接GBase-8s数据库的Java数据库连接驱动程序。 - **目标读者*...

    Cannot load JDBC driver class 'com.microsoft.sqlserver.jdbc.SQLServerDriver'

    3. 确认类加载机制无误,包括在代码中正确注册驱动和配置应用容器。 4. 调整和验证运行时的类路径设置。 5. 使用开发工具和源码来定位问题,例如通过IDE的调试功能。 6. 如果涉及数据库连接池(如DBCP),检查并优化...

    eclipse jdbc驱动加载包

    总的来说,Eclipse JDBC驱动加载包简化了Java开发者与数据库的交互,提供了高效、灵活和可移植的数据库访问机制。无论是新手还是经验丰富的开发者,都能通过掌握JDBC技术提升其数据库应用开发的能力。

    SQL Server JDBC driver

    SQL Server JDBC Driver是微软公司为Java应用程序提供的一种与SQL Server数据库进行交互的Java数据库连接(JDBC)驱动程序。在Java编程中,JDBC驱动扮演着至关重要的角色,它允许Java开发者通过编写Java代码来访问和...

    JDBC Driver

    例如,通过`Class.forName("oracle.jdbc.driver.OracleDriver")`加载驱动,然后使用`DriverManager.getConnection()`方法创建数据库连接。 **使用步骤** 1. 下载并放置`ojdbc7.jar`到项目类路径。 2. 注册驱动:`...

    hive jdbc驱动 2.5.15 及 2.6.1两个版本

    Hive JDBC驱动是连接Hadoop生态...无论是在数据提取、转换、加载(ETL)流程,还是在报表生成、数据分析任务中,它们都是不可或缺的工具。通过持续的版本迭代,Hive JDBC驱动不断优化,以适应不断发展的大数据需求。

    JDBC DriverManager.registerDriver(new Driver());

    除了手动注册驱动,现代的JDBC驱动通常采用自动注册机制,通过`META-INF/services/java.sql.Driver`文件来声明自己。当JDBC启动时,它会自动加载服务提供者配置文件中列出的驱动。 然而,`DriverManager`的注册方式...

    sqlserver2000 jdbc driver

    2. **建立连接**: 在Java代码中,使用`Class.forName()`方法加载JDBC驱动,然后通过`DriverManager.getConnection()`创建数据库连接。例如: ```java Class.forName(...

    JDBC中驱动加载的过程分析(上)

    通过这些机制,JDBC能够实现数据库驱动程序的动态加载和管理,从而支持多种不同的数据库系统,使得Java应用程序具有高度的数据库独立性和灵活性。这一设计体现了面向接口编程的原则,增强了系统的可扩展性和维护性。

    JDBCDriver

    "JDBCDriver"就是这个机制中的关键组件,它是连接Java应用程序和数据库的桥梁。 JDBC驱动主要有四种类型: 1. **类型1(JDBC-ODBC桥接驱动)**:这是最早的驱动方式,通过Java调用ODBC(Open Database ...

    JDBC中驱动加载的过程分析(下)

    HSqlDB的驱动类jdbcDriver也遵循了类似的模式。在静态初始化块中,一个新的jdbcDriver实例被创建并注册到DriverManager。connect方法则负责解析URL参数,创建HsqlProperties对象,并最终返回一个实现了java.sql....

    DM达梦7数据库驱动jar包

    在Java编程环境中,JDBC(Java Database Connectivity)是连接数据库的标准接口,而`Dm7JdbcDriver17.jar`就是实现了这个接口的特定版本,用于支持达梦数据库的版本7。 达梦数据库是一款国产自主的高性能、高安全性...

Global site tag (gtag.js) - Google Analytics