了解自动加载Jdbc驱动程序的Java服务提供程序机制

Chi*_*led 2 java service drivers jdbc

我试图准确地了解Java的服务提供程序机制如何工作以找到适当的JDBC驱动程序.这是我到目前为止:

由于Class.ForName不再用于显式加载JDBC Driver,因此Java会从传递给getConnection方法的数据库url字符串中知道它需要什么类型的驱动程序.例如,连接到oracle数据库的数据库url将是这样的:

public static final String DB_URL = "jdbc:oracle:thin@//localhost:1521/ORCL";
Run Code Online (Sandbox Code Playgroud)

然后,DriverManager将在projects类路径中指定的jar中查找oracle驱动程序的实现.它会在META-INF/Services每个jar的目录中查找驱动程序配置文件(其中将是实际驱动程序类的名称).在Class Loader将加载它找到的第一个比赛而忽略其他.

以上工作准确吗?如果我错过了什么或者出了什么问题,请告诉我.

c.s*_*.s. 5

如果检查源代码,您将看到Java不会尝试从URL检测驱动程序的实现名称(即驱动程序类).相反,如果它们能够处理该URL,它会询问它在类路径中找到的每个驱动程序实现.

行动的顺序似乎如下:

  • 当您要求连接时,DriverManager类已加载.它执行一个静态块,加载系统属性中指定的所有类jdbc.drivers
  • 然后调用服务提供者机制并加载java.sql.driver它在类路径中找到的所有类.

现在,当您要求连接时,它会遍历已注册的驱动程序并调用Driver.connect(String url,Properties info)方法.引用:

尝试与给定的URL建立数据库连接.如果驱动程序意识到连接到给定URL的驱动程序类型错误,则应返回"null".这很常见,因为当要求JDBC驱动程序管理器连接到给定的URL时,它会依次将URL传递给每个加载的驱动程序.

如果驱动程序是连接到给定URL的正确驱动程序但是无法连接到数据库,则应该抛出SQLException.

因此,返回非null连接的第一个驱动程序是将使用的驱动程序.

希望有所帮助