【问题标题】:JDBC DriverManager driver selectionJDBC DriverManager 驱动选择
【发布时间】:2014-08-01 00:58:05
【问题描述】:

我有一个应用程序,其目的是支持jdbc:hive://jdbc:hive2:// 协议的JDBC 连接。以下代码为两种协议加载了相应的 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 方法来匹配字符串。

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

我的问题是:除了 acceptURL 之外,DriverManager 是否还有其他方法可以在创建连接时选择要使用的 JDBC 驱动程序?而且,它完全依赖于DriverManager或者底层的JDBC驱动除了acceptURL()和jdbc的基础之外还需要实现支持代码。

【问题讨论】:

  • 这很模糊。您能否告诉我们您使用的是什么驱动程序以及遇到了什么异常?
  • 嗨@GiovanniBotta,我已经更新了描述。因为我正在研究不同的 JDBC 驱动程序,所以我使用了泛型。

标签: java hadoop jdbc hive


【解决方案1】:

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

如果驱动程序意识到连接到给定 URL 的驱动程序类型错误,它应该返回“null”。这很常见,因为当要求 JDBC 驱动程序管理器连接到给定 URL 时,它会将 URL 依次传递给每个加载的驱动程序。

Hive 的 JDBC 驱动违反约定,抛出异常,DriverManager 将其解释为“驱动理解 URL,但由于某种原因无法建立连接”。如果 DriverManager 调用驱动程序的 acceptsURL() 不仅作为 getDriver(url) 的一部分,而且作为 getConnection(url) 方法的一部分,那会很好,但它没有。

【讨论】:

  • 我在使用 MySql 和 Oracle 时遇到了类似的问题。最终我得到了一个 Oracle 连接的 MySql 格式错误的 URL 异常。这个错误是否也适用于 MySql 驱动程序?以及如何解决?我可以为每个连接清空 DriverManager 以确保它只有我需要的一个吗?
【解决方案2】:

使用较新版本的 JDBC,您不必将 JDBC 驱动程序加载到内存中。 JDBC 代码将扫描您的类路径以查找驱动程序。

这使您的setDriverClass 方法变得不必要。只需确保将驱动程序作为 JAR 包含在类路径中即可。

在以前的 JDBC 版本中,要获得连接,首先必须通过调用方法 Class.forName 来初始化 JDBC 驱动程序。此方法需要 java.sql.Driver 类型的对象。每个 JDBC 驱动程序都包含一个或多个实现接口 java.sql.Driver 的类。 [...]

在您的类路径中找到的任何 JDBC 4.0 驱动程序都会自动加载。 (但是,您必须使用 Class.forName 方法手动加载 JDBC 4.0 之前的所有驱动程序。)

(来自JDBC Java Trail

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    相关资源
    最近更新 更多