驱动程序管理器没有使用DB url的正确驱动程序

时间:2016-08-31 14:55:26

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

我有一个java应用程序,它可以创建到多个DB的连接。

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

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

当我尝试连接到极光数据库时,我希望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驱动程序?

1 个答案:

答案 0 :(得分:1)

java.sql.DriverManager会要求每个注册的驱动程序创建与JDBC网址的连接,直到一个驱动程序返回(非空)java.sql.Connection或抛出{{ 1}}。

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

  

SQLException尝试建立连接时,它会调用该驱动程序的DriverManager方法并将驱动程序传递给URL。如果connect实现了解URL,则它将返回Driver对象,或者如果无法将连接发送到数据库,则抛出Connection。如果SQLException实施不理解该网址,则会返回Driver

来自Driver.connect API doc

  

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

     

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

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

因此SQLException行为不端,因为它会为其无法识别的网址引发com.treasure_data.jdbc.TreasureDataDriver;您需要向该驱动程序的作者提交错误报告。

相关问题