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. }  
  • 相关阅读:
    -bash: fork: Cannot allocate memory 问题的处理
    Docker top 命令
    docker常见问题修复方法
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    What's the difference between encoding and charset?
    hexcode of é î Latin-1 Supplement
    炉石Advanced rulebook
    炉石bug反馈
    Sidecar pattern
    SQL JOIN
  • 原文地址:https://www.cnblogs.com/zhwl/p/2821608.html
Copyright © 2011-2022 走看看