為什么不用DriverManager.registerDriver(driver)

      網友投稿 1061 2025-04-02

      Class.forName()與JDBC沒有直接關系。它只是加載一個類。


      大多數JDBC驅動程序類通過調用在自己的靜態初始化器中注冊自己registerDriver()。

      registerDriver() 是真正不需要調用的真正調用(除非您編寫自己的JDBC驅動程序)。

      請注意,在JDBC 4 中,如果您的JDBC驅動程序是最新的,則不需要它們中的任何一個,因為可以使用服務定位機制找到驅動程序(即,只需忽略該調用并照常打開連接)即可。有關詳細信息,請參見文檔Drivermanager

      在Drivermanager的方法getConnection和getDrivers已得到增強,支持Java標準版服務提供商的機制。JDBC 4.0驅動程序必須包含該文件META-INF/services/java.sql.Driver。該文件包含的JDBC驅動程序實現的名稱java.sql.Driver。例如,要加載my.sql.Driver類,META-INF/services/java.sql.Driver文件將包含以下條目:

      my.sql.Driver

      應用程序不再需要使用顯式加載JDBC驅動程序Class.forName()。當前使用JDBC驅動程序加載的現有程序Class.forName()將繼續運行而無需進行修改。

      切勿DriverManager.registerDriver()手動調用方法。JDBC規范要求驅動程序在類加載時進行注冊,并通過加載該類Class.forName()。在JDBC 4中,僅在類路徑上就可以自動加載驅動程序。

      DriverManager.registerDriver()手動操作有潛在危險,因為它實際上會使驅動程序注冊兩次。如果您的代碼要求您注銷驅動程序以防止內存泄漏,那么您最終只會注銷一次,并保留第二個實例的注冊狀態。

      --*************************************************

      在實際開發中,程序中不直接去訪問實現了 Driver 接口的類,而是由驅動程序管理器類(java.sql.DriverManager)去調用這些Driver實現。

      DriverManager 類是驅動程序管理器類,負責管理驅動程序。

      通常不用顯式調用 DriverManager 類的 registerDriver() 方法來注冊驅動程序類的實例。

      //DriverManager.registerDriver()方式注冊驅動,還是依賴

      DriverManager.registerDriver(new com.mysql.jdbc.Driver());

      Class.forName()或ClassLoader對象.loadClass()

      因為 Driver 接口的驅動程序類都包含了靜態代碼塊,在這個靜態代碼塊中,會調用 DriverManager.registerDriver() 方法來注冊自身的一個實例,所以可以換一種方式來加載驅動。(即只要想辦法讓驅動類的這段靜態代碼塊執行即可注冊驅動類,而要讓這段靜態代碼塊執行,只要讓該類被類加載器加載即可)

      調用 Class 類的靜態方法 forName(),向其傳遞要加載的 JDBC 驅動的類名

      //1、通過反射,加載與注冊驅動類,解耦合(不直接依賴)

      Class.forName(“com.mysql.jdbc.Driver”);

      //2、通過類加載器加載驅動類,解耦合(不直接依賴)

      ClassLoader.getSystemClassLoader().loadClass(“com.mysql.jdbc.Driver”);

      反射:? ? ? ? ? ? ? Class.forName("com.mysql.jdbc.Driver")

      new方法:? ? ? ? Driver driver = new Driver();//com.mysql.jdbc.Driver

      DriverManager.registerDriver(driver);

      查看Driver源碼

      public class Driver extends NonRegisteringDriver implements java.sql.Driver {

      //

      // Register ourselves with the DriverManager

      //

      static {

      try {

      java.sql.DriverManager.registerDriver(new Driver());

      } catch (SQLException E) {

      throw new RuntimeException("Can't register driver!");

      為什么不用DriverManager.registerDriver(driver)

      }

      }

      /**

      * Construct a new driver and register it with DriverManager

      *

      * @throws SQLException

      * if a database error occurs.

      */

      public Driver() throws SQLException {

      // Required for Class.forName().newInstance()

      }

      ok,就是說其實起作用的是這一句代碼:

      java.sql.DriverManager.registerDriver(new Driver());

      第2種方式 Driver driver = new Driver() ?其在內部也執行靜態代碼塊,這相當于實例化了兩個Driver對象;

      第2種方式?Driver driver = new Driver() 會產生對某一種數據庫的依賴(會import驅動包),當脫離masql的jar的時程序將無法編譯,耦合性較高。

      反射:

      反射可避免對某一類產生依賴,使耦合性降低

      JDBC

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:word怎么單獨打拼音(word怎么單獨打拼音字母)
      下一篇:excel2010怎么擴充編輯欄(excel表格怎么添加編輯欄)
      相關文章
      亚洲小说区图片区另类春色| 亚洲无人区码一二三码区别图片| 亚洲日本VA中文字幕久久道具| 久久亚洲AV成人无码软件| 亚洲小说区图片区另类春色| 久久久久国产成人精品亚洲午夜| 色欲aⅴ亚洲情无码AV| 亚洲视频一区二区三区四区| 亚洲熟妇av一区二区三区下载| 少妇中文字幕乱码亚洲影视| 亚洲AV午夜成人片| 亚洲av无码潮喷在线观看| 亚洲av综合av一区| 亚洲国产综合91精品麻豆| 亚洲av成人无码久久精品| 亚洲ⅴ国产v天堂a无码二区| 亚洲第一精品在线视频| 色婷婷亚洲十月十月色天| 亚洲视频中文字幕在线| 亚洲熟妇av一区二区三区下载| 亚洲一区二区三区四区视频| 波多野结衣亚洲一级| 国产成人亚洲综合一区| 亚洲欧美中文日韩视频| AV激情亚洲男人的天堂国语| 亚洲αⅴ无码乱码在线观看性色| jzzijzzij在线观看亚洲熟妇| 一本色道久久88综合亚洲精品高清| 亚洲国产精品丝袜在线观看| 亚洲无码视频在线| 亚洲精品乱码久久久久久| 亚洲AV成人片色在线观看高潮| 亚洲男人第一av网站| 亚洲日产2021三区在线 | 亚洲videosbestsex日本| 国产精品亚洲精品| 国产精品亚洲专区无码牛牛| 亚洲国产成人久久一区久久| 亚洲日韩精品无码一区二区三区| 亚洲av永久无码精品网站| 亚洲系列国产精品制服丝袜第|