为什么不用DriverManager.registerDriver(driver)

举报
tea_year 发表于 2021/12/22 23:57:49 2021/12/22
【摘要】 Class.forName()与JDBC没有直接关系。它只是加载一个类。   大多数JDBC驱动程序类通过调用在自己的静态初始化器中注册自己registerDriver()。   registerDriver() 是真正不需要调用的真正调用(除非您编写自己的JDBC驱动程序)。   请注意,在J...

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() 方法来注册自身的一个实例,所以可以换一种方式来加载驱动。(即只要想办法让驱动类的这段静态代码块执行即可注册驱动类,而要让这段静态代码块执行,只要让该类被类加载器加载即可)

Java培训课程怎么样

调用 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源码


  
  1. public class Driver extends NonRegisteringDriver implements java.sql.Driver {
  2. //
  3. // Register ourselves with the DriverManager
  4. //
  5. static {
  6. try {
  7. java.sql.DriverManager.registerDriver(new Driver());
  8. } catch (SQLException E) {
  9. throw new RuntimeException("Can't register driver!");
  10. }
  11. }
  12. /**
  13. * Construct a new driver and register it with DriverManager
  14. *
  15. * @throws SQLException
  16. * if a database error occurs.
  17. */
  18. public Driver() throws SQLException {
  19. // Required for Class.forName().newInstance()
  20. }
  21.   ok,就是说其实起作用的是这一句代码:
  22. java.sql.DriverManager.registerDriver(new Driver());

 

第2种方式 Driver driver = new Driver()  其在内部也执行静态代码块,这相当于实例化了两个Driver对象;

第2种方式 Driver driver = new Driver() 会产生对某一种数据库的依赖(会import驱动包),当脱离masql的jar的时程序将无法编译,耦合性较高。
 

 

反射:

反射可避免对某一类产生依赖,使耦合性降低

文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。

原文链接:aaaedu.blog.csdn.net/article/details/104742914

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。