我试图准确理解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
将加载它找到的第一个匹配项并忽略其余匹配项。
以上工作准确吗?请告诉我如果我错过了什么或者出了什么问题。
答案 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
连接的第一个驱动程序是将要使用的驱动程序。
希望有所帮助