java JDBC驱动程序实现和类加载
不久前,我正在实现JDBC驱动程序。但在开始工作之前,我研究了一些MySQL JDBC驱动程序源代码,发现它们包含java.sql.Driver
接口的两个实现:com.mysql.jdbc.Driver和com.mysql.jdbc.NonRegisteringDriver,其中Driver
也扩展了NonRegisteringDriver
Driver
类只包含一个调用DriverManager.registerDriver()
来注册该类的静态块:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
而NonRegisteringDriver
实现了所有java.sql.Driver
接口方法
我的第一个想法是,通过以这种方式实现驱动程序,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
类是绝对没有意义的,因为它的父类和所有实现代码都将在执行静态块之前加载
我错过什么了吗
# 1 楼答案
不,实际上如果没有
com.mysql.jdbc.Driver
类,mysql
JDBC驱动程序的当前实现将无法满足java.sql.Driver
协议,其中claims:com.mysql.jdbc.NonRegisteringDriver
类不包含创建和注册自实例的这一部分为什么
mysql
开发人员决定将实现本身与本质上注册其实例的类区分开来?很难说清楚,但如果他们决定在同一个包中提供多个实现,可能会很方便。然后类com.mysql.jdbc.Driver
将扩展缺省值更新:本质上,事情就像我上面描述的那样。至少有3个派生类扩展了
com.mysql.jdbc.NonRegisteringDriver
:虽然
com.mysql.jdbc.Driver
是默认实现,但其他实现会重写基类中的一些方法。如果NonRegisteringDriver
将包含静态块以创建其实例并注册它,那么在内存中不可能有一个所需的mysql
驱动程序和派生类但总的来说,没有强有力的理由。例如
org.postgresql.Driver
实现contains完全实现java.sql.Driver
本身