zoukankan      html  css  js  c++  java
  • Class.forName 如何加载数据库驱动

    一直有一个疑问,Class.forName(driverName)是如何完成加载数据库驱动的,查阅了Oracle驱动的源码之后,大体弄清楚了。

    我们知道,Class.forName所做的工作是加载指定的class文件到java虚拟机的内存,加载class文件到内存的时候,该class文件的静态变量和静态初始化块是要执行的,玄机即在此。

    看Oracle数据库的驱动代码:

    Java代码 复制代码 收藏代码

    private static OracleDriver defaultDriver = null;   

    static  

    {   

      try  

      {   

        if (defaultDriver == null)   

    1.     {   
    2.       defaultDriver = new oracle.jdbc.OracleDriver();   
    3.       DriverManager.registerDriver(defaultDriver);   
    4.     }   
    5.   
    6.     AccessController.doPrivileged(new PrivilegedAction()   
    7.     {   
    8.       public Object run()   
    9.       {   
    10.         OracleDriver.registerMBeans();   
    11.         return null;   
    12.       }   
    13.     });   
    14.     Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");   
    15.   }   
    16.   catch (SQLException localSQLException)   
    17.   {   
    18.     Logger.getLogger("oracle.jdbc.driver").log(Level.SEVERE, "SQLException in static block.", localSQLException);   
    19.   }   
    20.   catch (RuntimeException localRuntimeException1)   
    21.   {   
    22.     Logger.getLogger("oracle.jdbc.driver").log(Level.SEVERE, "RuntimeException in static block.", localRuntimeException1);   
    23.   }   
    24.   
    25.   try  
    26.   {   
    27.     Class localClass = Class.forName("oracle.security.pki.OraclePKIProvider");   
    28.     Object localObject = localClass.newInstance();   
    29.   }   
    30.   catch (RuntimeException localRuntimeException2)   
    31.   {   
    32.   }   
    33.   catch (Exception localException)   
    34.   {   
    35.   }   
    36.   catch (NoClassDefFoundError localNoClassDefFoundError)   
    37.   {   
    38.   }   
    39.   catch (Error localError)   
    40.   {   
    41.   }   
    42.   catch (Throwable localThrowable)   
    43.   {   
    44.   }   
    45.   
    46.   systemTypeMap = new Hashtable(3);   
    47.   try  
    48.   {   
    49.     systemTypeMap.put("SYS.XMLTYPE", Class.forName("oracle.xdb.XMLTypeFactory"));   
    50.   }   
    51.   catch (ClassNotFoundException localClassNotFoundException1)   
    52.   {   
    53.   }   
    54.   
    55.   try  
    56.   {   
    57.     systemTypeMap.put("SYS.ANYTYPE", Class.forName("oracle.sql.AnyDataFactory"));   
    58.     systemTypeMap.put("SYS.ANYDATA", Class.forName("oracle.sql.TypeDescriptorFactory"));   
    59.   }   
    60.   catch (ClassNotFoundException localClassNotFoundException2)   
    61.   {   
    62.   }   
    63.   
    64.   _Copyright_2007_Oracle_All_Rights_Reserved_ = null;   
    65. }  
      private static OracleDriver defaultDriver = null;
      static
      {
        try
        {
          if (defaultDriver == null)
          {
            defaultDriver = new oracle.jdbc.OracleDriver();
            DriverManager.registerDriver(defaultDriver);
          }
    
          AccessController.doPrivileged(new PrivilegedAction()
          {
            public Object run()
            {
              OracleDriver.registerMBeans();
              return null;
            }
          });
          Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
        }
        catch (SQLException localSQLException)
        {
          Logger.getLogger("oracle.jdbc.driver").log(Level.SEVERE, "SQLException in static block.", localSQLException);
        }
        catch (RuntimeException localRuntimeException1)
        {
          Logger.getLogger("oracle.jdbc.driver").log(Level.SEVERE, "RuntimeException in static block.", localRuntimeException1);
        }
    
        try
        {
          Class localClass = Class.forName("oracle.security.pki.OraclePKIProvider");
          Object localObject = localClass.newInstance();
        }
        catch (RuntimeException localRuntimeException2)
        {
        }
        catch (Exception localException)
        {
        }
        catch (NoClassDefFoundError localNoClassDefFoundError)
        {
        }
        catch (Error localError)
        {
        }
        catch (Throwable localThrowable)
        {
        }
    
        systemTypeMap = new Hashtable(3);
        try
        {
          systemTypeMap.put("SYS.XMLTYPE", Class.forName("oracle.xdb.XMLTypeFactory"));
        }
        catch (ClassNotFoundException localClassNotFoundException1)
        {
        }
    
        try
        {
          systemTypeMap.put("SYS.ANYTYPE", Class.forName("oracle.sql.AnyDataFactory"));
          systemTypeMap.put("SYS.ANYDATA", Class.forName("oracle.sql.TypeDescriptorFactory"));
        }
        catch (ClassNotFoundException localClassNotFoundException2)
        {
        }
    
        _Copyright_2007_Oracle_All_Rights_Reserved_ = null;
      }

    由上面的代码可以看出,在通过Class.forName加载oracle驱动的时候,在静态初始化块中,会完成驱动的注册工作,即创建驱动类的实例,并把实例注册给驱动管理器DriverManager,核心代码如下:

    Java代码 复制代码 收藏代码
    1. if (defaultDriver == null)   
    2.      {   
    3.        defaultDriver = new oracle.jdbc.OracleDriver();   
    4.        DriverManager.registerDriver(defaultDriver);   
    5.      }  
     if (defaultDriver == null)
          {
            defaultDriver = new oracle.jdbc.OracleDriver();
            DriverManager.registerDriver(defaultDriver);
          }

    如此之后,就不能理解,接下来就可以从驱动管理器中获得到数据库的连接了,如:

    Java代码 复制代码 收藏代码
    1. public class ConnectionTool {   
    2.   
    3.     static String url = "jdbc:oracle:thin:@10.10.10.100:1521:loushang";   
    4.     static String driverName = "oracle.jdbc.driver.OracleDriver";   
    5.        
    6.     public static Connection getCon(){   
    7.            
    8.         try {   
    9.             Class.forName(driverName);   
    10.             return DriverManager.getConnection(url, "apitest""apitest");   
    11.         } catch (ClassNotFoundException e) {   
    12.             e.printStackTrace();   
    13.         } catch (SQLException e) {   
    14.             e.printStackTrace();   
    15.         }   
    16.         return null;   
    17.     }   
    18. }  
  • 相关阅读:
    百度网盘提交提取密码:根据cookies获取loginId 的js
    javaScript 中的私有,共有,特权属性和方法
    centos7 设置时区和时间
    centos 7 su jenkins 切换不过去
    在宿主机查看docker使用cpu、内存、网络、io情况
    Centos6.8通过yum安装mysql5.7 centos7.5适用
    docker-compose 安装redis sentinel,共享主机网络模式
    spring boot通过Interceptor和HandlerMethodReturnValueHandler实现统一处理为controller返回对象统计处理时间
    centos 7.5安装docker-CE 18
    centos查看系统版本信息
  • 原文地址:https://www.cnblogs.com/zhwl/p/2821608.html
Copyright © 2011-2022 走看看