1

我有一个能够创建到多个数据库的连接的 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 驱动程序?

4

1 回答 1

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.connectAPI 文档

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

SQLException如果它是连接到给定 URL 的正确驱动程序,但在连接到数据库时遇到问题,驱动程序应该抛出一个。

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

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

于 2016-09-01T14:45:42.527 回答