为啥 HiveConnection 不支持 getHoldability()?将 C3P0 与 HiveDriver 一起使用

Posted

技术标签:

【中文标题】为啥 HiveConnection 不支持 getHoldability()?将 C3P0 与 HiveDriver 一起使用【英文标题】:Why does not HiveConnection support getHoldability()? Using C3P0 with HiveDriver为什么 HiveConnection 不支持 getHoldability()?将 C3P0 与 HiveDriver 一起使用 【发布时间】:2017-11-15 16:46:55 【问题描述】:

我正在尝试将C3P0 (com.mchange.v2.c3p0.ComboPooledDataSource) 与HiveDriver (org.apache.hive.jdbc.HiveDriver) 一起使用。我有一个例外:

java.sql.SQLException: Method not supported
at org.apache.hive.jdbc.HiveConnection.getHoldability(HiveConnection.java:924)
at com.mchange.v2.c3p0.impl.NewPooledConnection.<init>(NewPooledConnection.java:106)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:159)

找到HiveConnection(here)的源码

/*
 * (non-Javadoc)
 *
 * @see java.sql.Connection#getHoldability()
 */

@Override
public int getHoldability() throws SQLException 
    // TODO Auto-generated method stub
    throw new SQLFeatureNotSupportedException("Method not supported");
   

我的问题:为什么HiveConnection 选择抛出一个 SQLFeatureNotSupportedException ?而不是只返回其中之一?

ResultSet.HOLD_CURSORS_OVER_COMMIT
ResultSet.CLOSE_CURSORS_AT_COMMIT

这是一个错误吗?

一般来说,是否可以使用这样的连接池 如C3P0Hive(我实际上使用的是Spark SQL)?

更新 1 (2017-11-15)

我刚刚尝试了dbcp2 (org.apache.commons.dbcp2.BasicDataSource),它成功了。我猜想dbcp2 不会调用Connection#getHoldability() 方法。

【问题讨论】:

这在技术上是一个错误,因为 JDBC 规范不允许驱动程序为 Connection.getHoldability() 抛出 SQLFeatureNotSupportedException。但问我们为什么是在要求猜测。您应该向 Hive 驱动程序的作者提交错误。 好的,谢谢。我向 Apache 提交了一个错误报告 HIVE-18082:issues.apache.org/jira/browse/HIVE-18082 【参考方案1】:

(我在这里回答我自己的问题。)

感谢 Mark Rotteveel 的建议,我现在也认为问题确实是一个错误。我已向 Apache 提交了一份错误报告 HIVE-18082 (here)。

在修复错误之前,一种临时解决方法是使用不同的连接池——DBCP2 而不是C3P0。由于某种原因,前者没有调用Connection#getHoldability(),因此不受HiveConnection中的这个错误的影响

【讨论】:

以上是关于为啥 HiveConnection 不支持 getHoldability()?将 C3P0 与 HiveDriver 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

为啥浏览器只支持 GET 和 POST HTTP 方法?

[App Actions Test Tool] 为啥不支持快捷方式xml文件?

C语言如何求一个二维数组有几行,还有为啥会提示gets()是一个未定义的标识符?

为啥fastjson只支持序列化属性的get方法

为啥 requests.get() 不返回? requests.get() 使用的默认超时是多少?

为啥 Java Future.get(timeout) 不可靠?