JDBC4中驱动程序类是如何定位的

2023-11-24

JDBC 第 4 版中的重要补充之一您不必显式加载 司机通过电话Class.forName不再了。当您的应用程序第一次尝试连接数据库时,DriverManager自动加载找到的驱动程序 应用程序CLASSPATH.

我的问题是如何?如果类路径中有多个驱动程序怎么办?

我可以猜测的一件事是,在解析连接 URL 时,可以确定所需的驱动程序是 JDBC 还是 ODBC,但如何才能从多个兼容 jdbc 的驱动程序中为我正在使用的数据库选择哪一个驱动程序呢? (假设我正在使用 MySql 并且我需要 MySql-Connector 驱动程序)。 JVM中是否有此类数据库驱动程序的静态映射?


每个 JDBC 4 兼容驱动程序的 jar 中都有一个名为META-INF/services/java.sql.Driver,在该文件中它将列出其实现java.sql.Driver。当您请求连接时,DriverManager将使用ServiceLoader找到所有(!)副本META-INF/services/java.sql.Driver在类路径中,然后将加载列出的所有类。当一个java.sql.Driver类被加载后,它必须向DriverManager, 所以DriverManager使用服务加载器加载所有类,并且每个类Driver实现自行注册。

当您请求连接时DriverManager, the DriverManager将迭代所有注册的驱动程序,要求他们提供Connection。驱动程序将使用 JDBC url 来检查它是否是它支持的协议(例如 Jaybird/Firebird JDBC 检查 url 是否以以下开头)"jdbc:firebirdsql:" or "jdbc:firebird:")。如果驱动不支持该协议,则会返回null,如果它确实支持该协议,它将返回一个已建立的连接,或者抛出一个SQLException(例如,如果您在 URL 中犯了错误,或者无法连接)。如果所有司机都回来null(不支持该协议),那么DriverManager会抛出一个SQLException有错误"No suitable driver found for <url>"

因此,类路径上有多个驱动程序并不重要,只要它们支持不同的协议即可,但是如果同一数据库有多个驱动程序(或至少:相同的协议前缀),它将使用驱动程序列表中的第一个驱动程序。根据 Java 版本,如果该驱动程序失败并显示SQLException,它将继续使用下一个驱动程序(至少是 Java 5 及更高版本),或者停止尝试并抛出异常(我相信这是在 Java 1.4 甚至更早的版本中)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC4中驱动程序类是如何定位的 的相关文章

随机推荐