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. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM