java - JDBC DriverManager 驱动程序选择

标签 java hadoop jdbc hive

我有一个应用程序,其目的是支持 jdbc:hive://jdbc:hive2:// 协议(protocol)的 JDBC 连接。以下代码加载这两种协议(protocol)相应的 JDBC 驱动程序:

private void setDriverClass() ... {
    ...
    Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver"); // acceptsURL -> jdbc:hive://
    Class.forName("org.apache.hive.jdbc.HiveDriver"); // acceptsURL -> jdbc:hive2://
}

据我了解,当调用客户端连接时,DriverManager 会调用 accepstURL() 方法来验证索引中的当前驱动程序是否可以处理该连接。 AcceptURL() 通常使用 jdbcURL.startsWith 方法来匹配字符串。

有时,由于“无效的 jdbcURL”错误,我的客户端连接未建立使用 jdbc:hive2:// 前缀。看起来 org.apache.hadoop.hive.jdbc.HiveDriver 正在接受 jdbc:hive2://前缀并抛出异常 --org.apache .hadoop.hive.jdbc.HiveDriver 显示在堆栈跟踪中,这是正确的,因为它的 AcceptURL 返回 false(正如我所验证的)。

我的问题是:除了acceptsURL之外,DriverManager还使用其他方法来选择创建连接时要使用的JDBC驱动程序吗?并且,它仅取决于DriverManager,或者底层的JDBC驱动程序需要实现除了acceptURL()和jdbc基础知识之外的支持代码。

最佳答案

DriverManager 依赖于 JDBC 规范(以及驱动程序对其的遵从性),其中指出:

The driver should return "null" if it realizes it is the wrong kind of driver to connect to the given URL. This will be common, as when the JDBC driver manager is asked to connect to a given URL it passes the URL to each loaded driver in turn.

Hive 的 JDBC 驱动程序违反了约定并抛出异常,DriverManager 将其解释为“驱动程序理解 URL,但由于某种原因无法建立连接”。如果 DriverManager 调用驱动程序的 acceptsURL() 不仅作为 getDriver(url) 的一部分,而且作为 getConnection(url) 的一部分,那就没问题了。 code> 方法,但事实并非如此。

关于java - JDBC DriverManager 驱动程序选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22104531/

相关文章:

java - 如何将 ISO 8601 日期时间字符串转换为 java.util.LocalDateTime?

java - 进程中创建的字符串对象总数?

java - 为什么我们在 Java 1.6 中从 FileChannel.map 得到 ClosedByInterruptException?

hadoop - 无法在 hadoop 集群中创建默认数据节点

Hadoop 计算所有拆分中所需的术语

java - 创建格式为 "yyyy-mm-dd"的变量 Date

java - 如何验证我自己的提供商(仅用于测试目的)

用于数据迁移的 Hadoop

maven - com.mysql.cj.jdbc.Driver、MySQL Connector 和 IntelliJ IDEA 出现 ClassNotFoundException

java - SQL异常 : no such table