我有一个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驱动程序?
答案 0 :(得分:1)
java.sql.DriverManager
会要求每个注册的驱动程序创建与JDBC网址的连接,直到一个驱动程序返回(非空)java.sql.Connection
或抛出{{ 1}}。
来自JDBC 4.2第9.2节驱动程序接口:
当
SQLException
尝试建立连接时,它会调用该驱动程序的DriverManager
方法并将驱动程序传递给URL。如果connect
实现了解URL,则它将返回Driver
对象,或者如果无法将连接发送到数据库,则抛出Connection
。如果SQLException
实施不理解该网址,则会返回Driver
。
尝试建立与给定URL的数据库连接。司机应该返回" null"如果它意识到它是连接到给定URL的错误类型的驱动程序。这很常见,因为当要求JDBC驱动程序管理器连接到给定的URL时,它会依次将URL传递给每个加载的驱动程序。
如果驱动程序是连接到给定URL但是无法连接到数据库的正确驱动程序,则应该抛出
null
。
当要求为其无法识别/支持的JDBC URL创建连接时,兼容的JDBC驱动程序必须返回SQLException
。仅当支持URL时(例如,因为前缀与驱动程序匹配),才允许驱动程序抛出null
(例如,当JDBC URL的其余部分存在语法错误,或者连接不能建立)。
因此SQLException
行为不端,因为它会为其无法识别的网址引发com.treasure_data.jdbc.TreasureDataDriver
;您需要向该驱动程序的作者提交错误报告。