`
wu_quanyin
  • 浏览: 208189 次
  • 性别: Icon_minigender_1
  • 来自: 福建省
社区版块
存档分类
最新评论

Mysql JDBC驱动源码分析(加载驱动)一

 
阅读更多

一,jdbc连接驱动器的注册加载

 

Class.forName("com.mysql.jdbc.Driver");

     当以上类被装载时执行以下程序

 

package com.mysql.jdbc;

import java.sql.SQLException;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
	
       //执行这个静态代码块
	static {
		try {//注册mysql实现的驱动类
			java.sql.DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}

	public Driver() throws SQLException {
		// Required for Class.forName().newInstance()
	}
}

 

 

进入java.sql.DriverManager.registerDirver(new Driver());中的功能实现

 

    public static synchronized void registerDriver(java.sql.Driver driver)
	throws SQLException {
	if (!initialized) {
            //初始化动作在下面作详解
	    initialize();
	}
        //用来存储驱动器信息
	DriverInfo di = new DriverInfo();

	di.driver = driver;
	di.driverClass = driver.getClass();
	di.driverClassName = di.driverClass.getName();

	// Not Required -- drivers.addElement(di);
        //用于加入驱动的集合
	writeDrivers.addElement(di); 
	println("registerDriver: " + di);
	
	/* 用于读取驱动的集合 */
	readDrivers = (java.util.Vector) writeDrivers.clone();
//用以上两个集合达到读写分离的状态,由 Vector 的 iterator 和 listIterator 方法所返回的迭代器是快速失败的
    }

   二,驱动器的初始化操作

 

    static void initialize() {
        if (initialized) {
            return;
        }
       //private static boolean initialized = false;静态全局变量,只初始化一次
        initialized = true;
        loadInitialDrivers();
        println("JDBC DriverManager initialized");
    }

 实现初始化操作

private static void loadInitialDrivers() {
        String drivers;
	
        try {//得到系统属性jdbc.drivers对应驱动的驱动名称,使用了JAVA的安全许可
	    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;
        }
        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);
            }
        }
    }

 以上初始化代码分析

  内部类对象,创建此对象时,它会从系统服务中加载驱动

 

 DriverService ds = new DriverService();

   代码如下:

   class DriverService implements java.security.PrivilegedAction {

        Iterator ps = null;
	public DriverService() {};
        public Object run() {

       //从系统服务中加载驱动
	ps = Service.providers(java.sql.Driver.class);

	/* Load these drivers, so that they can be instantiated. 
	 * It may be the case that the driver class may not be there
         * i.e. there may be a packaged driver with the service class
         * as implementation of java.sql.Driver but the actual class
         * may be missing. In that case a sun.misc.ServiceConfigurationError
         * will be thrown at runtime by the VM trying to locate 
	 * and load the service.
         * 
	 * Adding a try catch block to catch those runtime errors
         * if driver not available in classpath but it's 
	 * packaged as service and that service is there in classpath.
	 */
		
	try {
           while (ps.hasNext()) {
               ps.next();//遍历所有的驱动
           } // end while
	} catch(Throwable t) {
	    // Do nothing
	}
        return null;
    } //end run

} 

 

 

//使用特权去获取ds
java.security.AccessController.doPrivileged(ds);	

 

 

 

分享到:
评论
1 楼 pythonlord 2013-04-15  
顶 很有帮助,感谢楼主,好人一生平安

相关推荐

    Mysql JDBC源码 官网版

    MySQL Connector/J是官方提供的JDBC驱动程序,它的源代码能帮助开发者深入理解数据库连接、数据传输以及SQL语句在Java中的执行过程。 首先,我们来看看JDBC的概念。JDBC是Java平台上的一个标准接口,由Sun ...

    mysql-driver:mysql jdbc驱动源码阅读

    在“mysql-driver:mysql jdbc驱动源码阅读”这个主题中,我们将深入探讨该驱动的工作原理、关键组件以及源码分析。 1. **JDBC驱动类型**: JDBC驱动分为四种类型:Type 1、Type 2、Type 3 和 Type 4。MySQL ...

    mysql jdbc

    关于源码分析,MySQL JDBC驱动的源代码可以提供深入理解数据库连接的工作原理、事务处理、批处理以及错误处理机制等。对于开发者来说,阅读源码有助于优化性能,解决特定问题,或者为自定义功能提供灵感。 在工具...

    JAVA连mysql源码包JDBC

    压缩包中的“mysql-connector-java-5.1.18--源码”文件是MySQL的JDBC驱动源代码,通过阅读这些源代码,开发者可以深入了解JDBC驱动的工作原理,以及它是如何与MySQL服务器通信的。此外,这也有助于解决在使用过程中...

    MySQL的jar包以及源码

    这是一个Java Archive(JAR)文件,包含了MySQL JDBC驱动的所有必要类和资源,使得Java应用程序能够通过标准的JDBC接口与MySQL数据库进行通信。JDBC(Java Database Connectivity)是Java平台上的一个标准API,它...

    JDBC数据连接源码.rar

    这通常通过`Class.forName()`方法完成,例如`Class.forName("com.mysql.jdbc.Driver")`来加载MySQL的JDBC驱动。 2. **建立连接**:使用`DriverManager.getConnection()`方法创建到数据库的连接。参数通常包括数据库...

    jdbc接连数据库:oracle/derby/mysql

    标题中的“jdbc连接数据库:oracle/derby/mysql”是指使用Java Database Connectivity (JDBC) API来与三种不同的数据库...同时,了解并分析JDBC驱动源码有助于深入理解数据库操作的底层机制,提升开发和问题排查能力。

    eclipse-jdbc连接数据库源码

    Eclipse JDBC连接数据库源码分析 在Java编程中,JDBC(Java Database Connectivity)是用于与各种数据库进行交互的一组接口和类。本资源“eclipse-jdbc连接数据库源码”提供了一系列关于如何使用Eclipse IDE进行...

    jdbc分页查询源码

    本源码示例着重讲解如何利用JDBC进行分页查询,以避免一次性加载所有数据导致的性能瓶颈。 首先,我们需要了解分页查询的基本概念。分页查询是将数据库中的数据按一定的数量(如每页10条)分割,每次只查询一部分,...

    mysql-connector-java-5.1.26源码

    1. **DriverManager**: 这是Java数据库连接的入口点,负责管理所有的JDBC驱动。当Java应用通过`Class.forName()`加载了MySQL的驱动后,`DriverManager`会注册这个驱动,并根据用户提供的URL、用户名和密码建立到...

    Jdbc深入分析

    1. **加载并注册JDBC驱动**:首先需要加载特定数据库厂商提供的JDBC驱动类,并将其注册到JDBC驱动管理器中。 2. **获取数据库连接**:通过DriverManager.getConnection()方法,使用正确的URL、用户名和密码来获取...

    MYSQL网上购物源码

    通过分析这个【MySQL网上购物源码】项目,你可以全面学习到Web开发中的许多核心概念和技术,为成为一名合格的JavaWeb开发者奠定坚实的基础。同时,不断实践和理解这些知识,你的编程技能将会得到显著提升。

    jsp对mysql进行操作源码

    4. **连接MySQL**:在JSP中,首先需要加载MySQL的JDBC驱动,然后通过`DriverManager.getConnection()`方法建立到数据库的连接。连接字符串通常包含数据库URL、用户名和密码。 5. **创建数据库**:使用JDBC,可以...

    JDBC数据库操作

    JDBC源码分析** 深入源码可以帮助理解JDBC的工作原理。例如,`DriverManager.getConnection()`方法如何查找并注册合适的数据库驱动,以及如何通过URL和凭证建立连接。同时,了解Statement和ResultSet的实现,有助...

    JDBC连接ORACLE数据库源码

    JDBC(Java Database Connectivity)是Java语言中用来与数据库交互的标准API,它为开发者提供了一种标准的方式来访问各种类型的数据库,如MySQL、Oracle、SQL Server等。JDBC由一组接口和类组成,这些接口和类定义了...

    jsp+jdbc+mysql+servlet图书管理项目源码.zip

    4. **lib** 文件夹:存放项目所需的库文件,如MySQL的JDBC驱动。 5. **css** 和 **js** 文件夹:存放样式表和JavaScript文件,用于页面的样式和交互效果。 对于初学者来说,这个项目提供了一个很好的实践机会,可以...

    MyBatis源码分析.pdf

    使用JDBC访问数据库需要首先加载JDBC驱动,然后创建一个Connection,最后使用PreparedStatement执行数据库访问操作。JDBC是一种标准的数据库访问API,提供了基本的数据库访问能力,但是需要开发者手动管理数据库连接...

    JDBC连接数据库实例+附源码

    2. 在Java项目中引入MySQL的JDBC驱动包(例如mysql-connector-java-8.0.16.jar),创建相应的包结构。 3. 定义`Student`实体类,用于表示学生信息。 4. 设计`StudentDao`接口,定义数据库操作方法,如`...

    mysql-connector-java-5.1.18.jar

    MySQL Connector/J作为MySQL的JDBC驱动,它实现了JDBC规范,使得Java开发者无需关心底层数据库的具体实现,只需按照JDBC的编程模型编写代码,即可与MySQL数据库进行通信。 二、MySQL Connector/J 5.1.18特性 1. ...

Global site tag (gtag.js) - Google Analytics