gpt4 book ai didi

java - JDBC Driver实现和类加载

转载 作者:行者123 更新时间:2023-11-29 01:51:55 35 4
gpt4 key购买 nike

不久前,我正在实现 JDBC 驱动程序。但在开始工作之前,我研究了一些 MySQL JDBC 驱动程序源代码,发现它们包含 java.sql.Driver 接口(interface)的两个实现:com.mysql.jdbc.Drivercom.mysql.jdbc.NonRegisteringDriver ,其中 Driver 还扩展了 NonRegisteringDriver

Driver 类只包含一个调用 DriverManager.registerDriver() 来注册类的静态 block :

static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}

NonRegisteringDriver实现了所有的java.sql.Driver接口(interface)方法。

我的第一个想法是,通过这种方式实现驱动程序,MySQL 驱动程序的开发人员将遵循 java.sql.Driver说明以下内容的指南:

It is strongly recommended that each Driver class should be small and standalone so that the Driver class can be loaded and queried without bringing in vast quantities of supporting code.

但是如果我正确地理解了 Java 类加载,那么拥有单独的 com.mysql.jdbc.Driver 类绝对没有意义,因为它的所有实现代码的父级无论如何都会在执行之前加载静态 block 。

我是不是漏掉了什么?

最佳答案

不,实际上如果没有 com.mysql.jdbc.Driver 类,mysql JDBC 驱动程序的当前实现将无法满足 java.sql.Driver协议(protocol),claims :

When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager. This means that a user can load and register a driver by calling

Class.forName("foo.bah.Driver")}  

com.mysql.jdbc.NonRegisteringDriver 类不包含创建自实例和注册它的这一部分。

为什么 mysql 开发人员决定将实现本身与本质上注册其实例的类区分开来?很难准确地说,但如果他们决定在同一个包中提供多个实现,那可能会很方便。然后 com.mysql.jdbc.Driver 类将扩展默认的一个。

更新:基本上事情就像我上面描述的那样。至少有 3 个派生类扩展 com.mysql.jdbc.NonRegisteringDriver:

  • com.mysql.jdbc.Driver
  • com.mysql.fabric.jdbc.FabricMySQLDriver
  • com.mysql.jdbc.NonRegisteringReplicationDriver

虽然 com.mysql.jdbc.Driver 是默认实现,但其他实现会覆盖基类中的一些方法。如果 NonRegisteringDriver 包含用于创建其实例并注册它的静态 block ,则不可能在内存中恰好有一个需要的 mysql 驱动程序和派生类。

但总的来说,没有充分的理由这样做。例如org.postgresql.Driver实现contains java.sql.Driver 本身的完整实现。

关于java - JDBC Driver实现和类加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39319346/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com