qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          數據庫注冊兩種方式的比較

          在學習JDBC的時候,通常有兩種方式去注冊數據庫驅動程序(這里采用MySQL數據庫),分別為:
          DriverManager.registerDriver(new Driver());
          Class.forName("com.mysql.jdbc.Driver");
            那么這兩種方式有什么異同呢?首先我們到DriverManager中去看一下,
          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);
          /* update the read copy of drivers vector */
          readDrivers = (java.util.Vector) writeDrivers.clone();
          }
            很明顯,DriverManager將我們需要注冊的驅動程序信息封裝成DriverInfo放進了一個writeDrivers中,這個writeDrivers是DriverManager中聲明的一個static類型Vector變量。在getConnection的時候會再用到。
            那么Class.forName("com.mysql.jdbc.Driver")是如何注冊驅動程序的呢,我們知道Class.forName("類名")的主要作用是向虛擬機實例化一個Class實例,我們看一下com.mysql.jdbc.Driver的源代碼。
          public class Driver extends NonRegisteringDriver implements java.sql.Driver {
          // ~ Static fields/initializers
          // ---------------------------------------------
          //
          // Register ourselves with the DriverManager
          //
          static {
          try {
          java.sql.DriverManager.registerDriver(new Driver());
          } catch (SQLException E) {
          throw new RuntimeException("Can't register driver!");
          }
          }
            在 com.mysql.jdbc.Driver中有一段靜態代碼塊,是向 DriverManager注冊一個Driver實例。這樣在 Class.forName("com.mysql.jdbc.Driver")的時候,就會首先去執行這個靜態代碼塊,于是和DriverManager.registerDriver(new Driver())有了相同的效果。
            那么對于這兩種方法,在這里,我推薦使用第二種,即Class.forName("類名")的方式。原因有兩點
            1、在我們執行DriverManager.registerDriver(new Driver())的時候,靜態代碼塊也已經執行了,相當于是實例化了兩個Driver對象。
            2、 DriverManager.registerDriver(new Driver())產生了一種對MySQL的一種依賴。而Class.forName的方式我們完全可以在運行的時候再動態改變。

          posted on 2013-12-23 09:39 順其自然EVO 閱讀(248) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2013年12月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 伊金霍洛旗| 嵊泗县| 正蓝旗| 凤阳县| 平谷区| 教育| 邹城市| 铜陵市| 桑植县| 股票| 铁岭市| 民县| 广饶县| 佛山市| 吉首市| 桓台县| 定远县| 天祝| 阿克陶县| 正镶白旗| 新竹市| 岗巴县| 大冶市| 靖宇县| 丹凤县| 滨州市| 搜索| 桂平市| 海城市| 南溪县| 兴和县| 阳西县| 长顺县| 黄骅市| 临清市| 寻乌县| 海口市| 临高县| 屯昌县| 沁阳市| 乐陵市|