qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          數(shù)據(jù)庫注冊兩種方式的比較

          在學(xué)習(xí)JDBC的時候,通常有兩種方式去注冊數(shù)據(jù)庫驅(qū)動程序(這里采用MySQL數(shù)據(jù)庫),分別為:
          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將我們需要注冊的驅(qū)動程序信息封裝成DriverInfo放進了一個writeDrivers中,這個writeDrivers是DriverManager中聲明的一個static類型Vector變量。在getConnection的時候會再用到。
            那么Class.forName("com.mysql.jdbc.Driver")是如何注冊驅(qū)動程序的呢,我們知道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中有一段靜態(tài)代碼塊,是向 DriverManager注冊一個Driver實例。這樣在 Class.forName("com.mysql.jdbc.Driver")的時候,就會首先去執(zhí)行這個靜態(tài)代碼塊,于是和DriverManager.registerDriver(new Driver())有了相同的效果。
            那么對于這兩種方法,在這里,我推薦使用第二種,即Class.forName("類名")的方式。原因有兩點
            1、在我們執(zhí)行DriverManager.registerDriver(new Driver())的時候,靜態(tài)代碼塊也已經(jīng)執(zhí)行了,相當(dāng)于是實例化了兩個Driver對象。
            2、 DriverManager.registerDriver(new Driver())產(chǎn)生了一種對MySQL的一種依賴。而Class.forName的方式我們完全可以在運行的時候再動態(tài)改變。

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

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

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 太谷县| 凤山县| 铜川市| 南郑县| 扎赉特旗| 大同县| 班戈县| 多伦县| 瓮安县| 伊金霍洛旗| 邮箱| 军事| 寿宁县| 临武县| 榕江县| 册亨县| 海丰县| 噶尔县| 通山县| 治县。| 铜山县| 西城区| 元谋县| 宁化县| 大城县| 三原县| 谢通门县| 金川县| 建瓯市| 剑川县| 大安市| 华池县| 章丘市| 白河县| 行唐县| 绥滨县| 惠州市| 温宿县| 扎鲁特旗| 金阳县| 陇南市|