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

时间:2014-10-24 15:55:36

标签: java jdbc service drivers

我试图准确理解Java的服务提供程序机制如何工作以找到适当的JDBC驱动程序。以下是我到目前为止的情况:

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

public static final String DB_URL = "jdbc:oracle:thin@//localhost:1521/ORCL";

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

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

1 个答案:

答案 0 :(得分:5)

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

行动顺序似乎如下:

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

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

  

尝试建立与给定URL的数据库连接。司机   应该返回" null"如果它意识到这是一种错误的驱动程序   连接到给定的URL。这将是常见的,就像JDBC驱动程序一样   管理员被要求连接到给定的URL,它将URL传递给每个URL   依次装载司机。

     

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

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

希望有所帮助