DriverManager.registerDriver(new com.mysql.jdbc.Driver())为什么Driver会创建两次

在学习JDBC的时候,通常有两种方式去注册数据库驱动程序(这里采用MySQL数据库),分别为:
Java代码

  1. DriverManager.registerDriver(new Driver());
  2. Class.forName(“com.mysql.jdbc.Driver”);
    那么这两种方式有什么异同呢?首先我们到DriverManager中去看一下,
    Java代码
  3. public static synchronized void registerDriver(java.sql.Driver driver)
  4. throws SQLException {
  5. if (!initialized) {
  6. initialize();
  7. }
  8. DriverInfo di = new DriverInfo();
  9. di.driver = driver;
  10. di.driverClass = driver.getClass();
  11. di.driverClassName = di.driverClass.getName();
  12. // Not Required – drivers.addElement(di);
  13. writeDrivers.addElement(di);
  14. println(“registerDriver: ” + di);
  15. /* update the read copy of drivers vector */
  16. readDrivers = (java.util.Vector) writeDrivers.clone();
  17. }
    很明显,DriverManager将我们需要注册的驱动程序信息封装成DriverInfo放进了一个writeDrivers中,这个writeDrivers是DriverManager中声明的一个static类型Vector变量。在getConnection的时候会再用到。
    那么Class.forName(“com.mysql.jdbc.Driver”)是如何注册驱动程序的呢,我们知道Class.forName(“类名”)的主要作用是向虚拟机实例化一个Class实例,我们看一下com.mysql.jdbc.Driver的源代码。
    Java代码
  18. public class Driver extends NonRegisteringDriver implements java.sql.Driver {
  19. // ~ Static fields/initializers
  20. // ———————————————
  21. //
  22. // Register ourselves with the DriverManager
  23. //
  24. static {
  25. try {
  26. java.sql.DriverManager.registerDriver(new Driver());
  27. } catch (SQLException E) {
  28. throw new RuntimeException(“Can’t register driver!”);
  29. }
  30. }
    在 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的方式我们完全可以在运行的时候再动态改变。

作者:BaldWinf
来源:CSDN
原文:https://blog.csdn.net/u011118321/article/details/70254820
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值