【问题标题】:Driver manager not using the correct driver for the DB url驱动程序管理器没有为 DB url 使用正确的驱动程序
【发布时间】:2017-01-08 05:47:38
【问题描述】:

我有一个 java 应用程序,它能够创建到多个数据库的连接。

我们正在加载这些驱动程序:

Class.forName("org.mariadb.jdbc.Driver");
Class.forName("com.treasure_data.jdbc.TreasureDataDriver");

当我尝试连接到 aurora DB 时,我希望 DriverManager 使用 MariaDB 驱动程序 - 但它使用的是 Treasure_data 驱动程序。

java.sql.Connection conn1 = DriverManager.getConnection("jdbc:mysql:aurora://YYY-aurora.XXXXX.com:3306/SomeDBName", "USER", "PASSWORD");

这是我得到的错误:

java.sql.SQLException: Invalid JDBC URL: jdbc:mysql:aurora://YYY-aurora.XXXXX.com:3306/SomeDBName. URL prefix must be jdbc:td://

为什么DriverManager 使用的是 Treasure_data 驱动程序?

【问题讨论】:

  • 你的期望是什么意思?您必须指定数据库案例及其参数

标签: java jdbc database-connection amazon-aurora treasure-data


【解决方案1】:

java.sql.DriverManager 将要求每个注册的驱动程序创建与 JDBC url 的连接,直到一个驱动程序返回(非空)java.sql.Connection 或抛出 SQLException

来自 JDBC 4.2 第 9.2 节 驱动程序接口

DriverManager 尝试建立连接时,它会调用该驱动程序的connect 方法并将URL 传递给驱动程序。如果 Driver 实现理解 URL,它将返回一个 Connection 对象,如果无法与数据库建立连接,则抛出一个 SQLException。如果Driver 实现不理解URL,它将返回null

来自Driver.connect API doc

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

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

因此,兼容的 JDBC 驱动程序必须在被要求为其不识别/不支持的 JDBC URL 创建连接时返回null。仅当 URL 受支持时(例如,因为前缀与驱动程序匹配),驱动程序才允许抛出 SQLException(例如,当 JDBC URL 的其余部分存在语法错误,或者无法建立连接时) .

所以com.treasure_data.jdbc.TreasureDataDriver 行为不端,因为它会为无法识别的 URL 抛出 SQLException;您需要向该驱动程序的作者提交错误报告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多