天天看點

DriverManager.getConnection Class.forName 詳解

以前隻是知道如果需要進行資料庫連接配接,需要按照   Connection connection = null;

  try {

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

   try {

     connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/platform","root","admin");

    } catch (SQLException e) {

      System.out.println("Problem getting connection"+ e);

    }   } catch (ClassNotFoundException e) {

     System.out.println("Couldn't find driver"+e);

  } finally {

   try {

    if (connection != null) {

     connection.close();

    }

   } catch (SQLException e) {

     System.out.println("Problem closing connection"+e);

   }

  }  } 之後到底發生了什麼不是很了解,今天查詢了一下jdk的源代碼,終于搞清楚了怎麼回事, 在我們Class.forName的時候注冊的是Driver的實作類,在API文檔中如下寫了Driver的作用 “ 在加載某一 Driver 類時,它應該建立自己的執行個體并向 DriverManager 注冊該執行個體。這意味着使用者可以通過調用以下程式加載和注冊一個驅動程式” 那如何才能自動注冊呢,有一點需要注意的就是Class.forName就可以注冊,隻能将注冊資訊添加到靜态代碼中,所有Driver代碼的實作類中都采用了      static {

        try {

            DriverManager.registerDriver(new ProxoolDriver());

        } catch (SQLException e) {

            System.out.println(e.toString());

        }

    } 這種方式進行注冊,這樣在Class.forName的時候就會執行上面的代碼,也就是向系統注冊驅動程式,注冊驅動程式就是他會組裝DriverInfo後緩存到DriverManager中,便于後面進行處理。 然後開始取得資料庫連接配接,這個時候他會比對注冊的所有的驅動,查詢合适的驅動程式     首先判斷是否有加載驅動的權限,如果沒有,比對下一個.     然後調用調用Driver的connect方法,如果傳回null或者抛出異常,比對下一個     最後比對到合适的驅動,調用驅動對象的connect方法進行連接配接,如果沒有将會提示沒有合适的驅動. 這就要求編寫驅動的connect方法一開始最好進行url的有效性校驗,隻是處理自己要求的驅動url 注意采用了一個native的callerClassLoader來盤點是否有權限加載Driver 按照上面的原理我們可以自己寫驅動程式了。