`
zlx19900228
  • 浏览: 51576 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDBC驱动加载过程

 
阅读更多
以一段mysql jdbc加载的demo为例:
  String url ="jdbc:mysql://localhost:3306/jdbcana";     
  String username = "root";
  String password = "root";
  Connection con = DriverManager.getConnection(url, username, password);


首先,
Connection con = DriverManager.getConnection(url, username, password)
  这段代码会得到connection,跟进代码,
public static Connection getConnection(String url, 
	String user, String password) throws SQLException {
        java.util.Properties info = new java.util.Properties();

        // Gets the classloader of the code that called this method, may 
	// be null.
	ClassLoader callerCL = DriverManager.getCallerClassLoader();

	if (user != null) {
	    info.put("user", user);
	}
	if (password != null) {
	    info.put("password", password);
	}

        return (getConnection(url, info, callerCL));
}


首先是获得了加载当前类的classloader,接下来将属性放入properties文件中,
接下来调用getConnection(url, info, callerCL)方法,这里面会调用initialize()->loadInitialDrivers();方法,loadInitialDrivers()方法中会首先尝试从System.getproperty中获取设置的jdbc.drivers属性,没设置就不管了,接下来会调用:
DriverService ds = new DriverService();
 // Have all the privileges to get all the 
	 // implementation of java.sql.Driver
	 java.security.AccessController.doPrivileged(ds);



这个方法会调用Service.providers(Driver.class);方法,他其实是从String str = "META-INF/services/" + this.service.getName();中加载类,这个类就是sun.jdbc.odbc.JdbcOdbcDriver,
return Class.forName(str, true, this.loader).newInstance();并生产实例,看sun.jdbc.odbc.JdbcOdbcDriver源码,它也是JdbcOdbcDriver localJdbcOdbcDriver = new JdbcOdbcDriver();然后DriverManager.registerDriver(localJdbcOdbcDriver);向驱动管理器注册了驱动,与Mysqljdbc一个道理,注册驱动代码中,会实例化DriverInfo,这是对驱动信息的封装,然后会向driver vetor中加入DriverInfo对象,初始化完成之后,从vetor中拿出DriverInfo,然后取出driver,调用connect方法,这个方法会解析url,如果符合当前驱动的规则,那么就用当前驱动,比如如果传入的是jdbc:mysql://localhost:3306/jdbcana就可以解析出来是用mysql jdbc 驱动。而Mysql jdbc驱动又是什么时候加载的呢,因为我们将mysql jar包加入了classpath环境下,所以systemclassloader会加载其环境下的jar包,而在Driver类中有一段static语句块:
try {
			java.sql.DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}
static {
,在这里,也向DriverManager注册了driver。

总的来说,所有数据库厂商提供的驱动都是要向DriverManger中registerDriver,这样才能在以后根据URL来判定调用哪个驱动器。而initialize-> loadInitialDrivers方法只是加载系统提供的驱动器,或者加载设置了jdbc.dirvers这个system.property的驱动,其他驱动的注册都是依赖于classloader的加载机制,通过static语句块来实现类的加载
分享到:
评论

相关推荐

    数据库jdbc驱动加载过程

    JDBC 驱动加载过程详解 数据库 JDBC 驱动加载过程是指在 Java 应用程序中加载和注册数据库 JDBC 驱动程序的过程,以便于应用程序连接到数据库并进行数据交互。下面是对 JDBC 驱动加载过程的详细解释。 JDBC 驱动...

    JDBC 驱动加载过程分析

    在Java数据库连接(JDBC)中,驱动加载过程是连接到特定数据库的关键步骤。Oracle JDBC驱动是用于与Oracle数据库交互的Java驱动程序。本篇将深入解析Oracle JDBC驱动的加载过程,帮助理解如何通过JDBC建立数据库连接...

    JDBC驱动加载分析

    ### JDBC驱动加载分析 #### 背景与概念 在Java开发中,JDBC (Java Database Connectivity) 是一种用于执行SQL语句的标准Java API,它由一组用Java语言编写的类和接口组成。JDBC提供了Java应用程序与各种类型的关系...

    java 加载JDBC驱动程序

    此图片可能包含关于JDBC驱动加载过程或数据库操作的可视化表示,帮助理解概念。 总的来说,加载JDBC驱动是Java应用程序与数据库交互的关键步骤,涉及对Java类加载机制的理解以及对JDBC API的正确使用。通过`Class....

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

    JDBC驱动加载的过程涉及`Driver`接口的实现和`DriverManager`类的使用。通过这些机制,JDBC能够实现数据库驱动程序的动态加载和管理,从而支持多种不同的数据库系统,使得Java应用程序具有高度的数据库独立性和灵活...

    oracle12 jdbc驱动包

    此外,Oracle 12c JDBC驱动还支持高级特性,如分布式事务处理、JNDI查找、连接池管理、数据源支持、以及SQL的高级功能,如批量处理、存储过程调用、游标处理等。对于大型企业级应用,这些特性尤其重要,它们能确保...

    impala数据库JDBC驱动集

    2. 加载JDBC驱动: ```java Class.forName("com.cloudera.impala.jdbc41.Driver"); ``` 这里的类名取决于实际使用的JDBC驱动版本。 3. 创建数据库连接: ```java String url = "jdbc:impala://<impala_server>:...

    加载同一类型但是版本不同JDBC驱动

    2. **加载驱动**: 在自定义类加载器中,使用`Class.forName()`方法加载特定版本的JDBC驱动。例如,对于Oracle 11g,我们可能加载`oracle.jdbc.driver.OracleDriver`,而对于Oracle 19c,我们加载`oracle.jdbc.Oracle...

    sqlserver2005-jdbc驱动、sqlserver2008-jdbc驱动、mysql-jdbc驱动、oracle驱动-

    本压缩包包含了适用于不同数据库系统的JDBC驱动,包括sqlserver2005-jdbc驱动、sqlserver2008-jdbc驱动、mysql-jdbc驱动以及oracle驱动,这使得开发者能够方便地与这些数据库进行通信。 1. SQL Server JDBC驱动: ...

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

    在深入探讨JDBC驱动加载的过程之前,我们先简要回顾一下上文提到的JDBC(Java Database Connectivity)是什么。JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的...

    最新Oracle_11g JDBC驱动包

    1. **加载驱动**:在Java程序中,首先需要通过`Class.forName()`方法加载相应的JDBC驱动类。 2. **建立连接**:使用`DriverManager.getConnection()`方法,传入数据库URL、用户名和密码来建立连接。 3. **创建...

    sql server 2000 jdbc 驱动

    总之,使用SQL Server 2000 JDBC驱动连接数据库是一个涉及下载驱动、配置项目、编写连接代码和执行SQL操作的过程。理解这些步骤和原理对于Java开发者来说至关重要,尤其是在需要与不同数据库系统交互时。

    神通数据库JDBC驱动包

    JDBC驱动程序分为四种类型:Type 1、Type 2、Type 3和Type 4,神通数据库的JDBC驱动属于Type 4,即纯Java的网络驱动,无需依赖数据库供应商的本地库,提高了跨平台兼容性和性能。 oscarJDBC.jar文件包含了神通...

    mysql-jdbc驱动包8.0.11

    1. 加载驱动:通过`Class.forName()`方法加载MySQL JDBC驱动的类,例如`com.mysql.cj.jdbc.Driver`。 2. 创建连接:使用`DriverManager.getConnection()`方法建立到MySQL服务器的连接,传入数据库URL、用户名和密码...

    所有的JDBC驱动大全

    这个"所有的JDBC驱动大全"压缩包,为开发者提供了方便的一站式解决方案,可以在开发过程中快速接入不同的数据库系统,极大地提升了开发效率。同时,这也反映出JDBC作为Java数据库编程的标准接口,其重要性和广泛的...

    hive jdbc驱动 2.5.15 及 2.6.1两个版本

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

    JDBC驱动及JAR包

    JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库进行交互的一种标准接口。它由Sun Microsystems...同时,管理好JDBC驱动的JAR包,确保它们与数据库系统的版本相匹配,也是开发过程中的重要环节。

    SQL Server JDBC驱动jar包

    SQL Server JDBC驱动jar包是Java应用程序与Microsoft SQL Server数据库进行交互的重要组件。JDBC(Java Database Connectivity)是Java平台的标准接口,它允许Java程序通过Java API来连接和操作各种数据库,包括SQL ...

    各种数据库的jdbc驱动

    加载Oracle JDBC驱动并建立连接的过程与MySQL类似,但需要使用特定的URL格式和驱动类名。 4. **SQL Server 2005 JDBC驱动**: SQL Server 2005提供了JDBC驱动,称为Microsoft SQL Server JDBC Driver,它支持Java...

    sqlserver2005 JDBC驱动程序JAR包

    1. **全面的SQL支持**:JDBC驱动支持SQL Server 2005的所有SQL语法,包括复杂查询、存储过程和事务处理。 2. **性能优化**:Type 4驱动通过高效的网络协议与SQL Server通信,降低了延迟并提高了吞吐量。 3. **并发...

Global site tag (gtag.js) - Google Analytics