【问题标题】:Understanding Java's Service Provider Mechanism that automatically loads the Jdbc driver了解Java自动加载Jdbc驱动的服务提供者机制
【发布时间】:2014-10-24 15:55:35
【问题描述】:

我试图准确理解 Java 的服务提供者机制如何工作以找到合适的 JDBC 驱动程序。这是我目前所拥有的:

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

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

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

上面的工作准确吗?如果我遗漏了什么或出错了,请告诉我。

【问题讨论】:

    标签: java jdbc service drivers


    【解决方案1】:

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

    动作的顺序似乎如下:

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

    现在,当您要求它建立连接时,它会循环通过已注册的驱动程序并在它们上调用Driver.connect(String url, Properties info) 方法。引用:

    尝试与给定 URL 建立数据库连接。司机 如果它意识到它是错误类型的驱动程序,则应返回“null” 连接到给定的 URL。这很常见,就像 JDBC 驱动程序一样 manager 被要求连接到给定的 URL,它将 URL 传递给每个 依次加载驱动程序。

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

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

    希望有帮助

    【讨论】:

    • 有道理,但谁设置系统属性“jdbc.drivers”。
    • @Moh123 好吧,如果需要特定的 jdbc 驱动程序,开发人员可以这样做。 (即使用-Djdbc.drivers=<: separated list>启动jvm)
    • 但除此之外,它是否已经拥有最常用驱动程序的列表。是否有一些驱动程序与 java 本身捆绑在一起,可能是用于连接到与 java 捆绑在一起的 Apache Derby 数据库的驱动程序,供想要测试 Jdbc 而无需安装单独的数据库的用户使用。
    • @Moh123 嗯,它似乎不是那样的。在我的系统中打印System.getProperties() 不包括该属性
    • 是的,默认情况下似乎没有设置“jdbc.drivers”属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2011-08-24
    • 2013-08-13
    • 2013-04-03
    相关资源
    最近更新 更多