为啥 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
这是一个错误吗?
一般来说,是否可以使用这样的连接池
如C3P0
和Hive
(我实际上使用的是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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
[App Actions Test Tool] 为啥不支持快捷方式xml文件?
C语言如何求一个二维数组有几行,还有为啥会提示gets()是一个未定义的标识符?