我有一个应用程序,它的目的是支持jdbc连接 jdbc:hive://
以及 jdbc:hive2://
协议。以下代码为两个协议加载相应的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()方法来验证索引中的当前驱动程序是否可以处理该连接。acceptsurl()通常使用jdbcurl.startswith方法来匹配字符串。
有时我的客户端连接使用 jdbc:hive2://
由于“无效jdbcurl”错误,未建立前缀。好像 org.apache.hadoop.hive.jdbc.HiveDriver
正在接受 jdbc:hive2://
前缀并引发异常-- org.apache.hadoop.hive.jdbc.HiveDriver
在stacktrace--中显示,这是正确的,因为它的acceptsurl返回false(正如我已经验证的)。
我的问题是:除了acceptsurl之外,drivermanager是否还使用其他方法来选择在创建连接时要使用的jdbc驱动程序?而且,它完全依赖于drivermanager,或者底层的jdbc驱动程序需要实现除acceptsurl()和jdbc基础之外的支持代码。
2条答案
按热度按时间pjngdqdw1#
drivermanager依赖于jdbc规范(以及驱动程序对它的遵从性),其中指出:
如果驱动程序意识到连接到给定url的驱动程序类型不对,则应返回“null”。这很常见,因为当jdbc驱动程序管理器被要求连接到给定的url时,它会依次将url传递给每个加载的驱动程序。
hive的jdbc驱动程序违反了约定并引发异常,而drivermanager将其解释为“驱动程序理解url,但由于某种原因无法建立连接”。万一司机经理打电话给司机办公室,那就好了
acceptsURL()
不仅仅是getDriver(url)
,但也作为getConnection(url)
方法,但它没有。qlfbtfca2#
对于较新版本的jdbc,您不必将jdbc驱动程序加载到内存中。jdbc代码将扫描类路径中的驱动程序。
这让你的
setDriverClass
方法不必要。只需确保将驱动程序作为jar包含在类路径中。在以前版本的jdbc中,要获得连接,首先必须通过调用class.forname方法初始化jdbc驱动程序。此方法需要java.sql.driver类型的对象。每个jdbc驱动程序都包含一个或多个实现接口java.sql.driver的类。[…]
在类路径中找到的任何JDBC4.0驱动程序都将自动加载(但是,必须使用方法类.forname手动加载JDBC4.0之前的所有驱动程序。)
(来自jdbcjava trail)