为什么HiveConnection不支持getHoldability()?将C3P0与HiveDriver配合使用

时间:2017-11-15 16:46:56

标签: jdbc hive apache-spark-sql connection-pooling c3p0

我正在尝试将C3P0com.mchange.v2.c3p0.ComboPooledDataSource)与HiveDriverorg.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)

我找到了HiveConnectionhere

的源代码
/*
 * (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)

我刚试过dbcp2org.apache.commons.dbcp2.BasicDataSource)并且它有效。我想某种方式dbcp2不会调用Connection#getHoldability()方法。

1 个答案:

答案 0 :(得分:0)

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

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

在修复错误之前,一个临时解决方法是使用其他连接池 - DBCP2而不是C3P0。出于某种原因,前者不会调用Connection#getHoldability(),因此不会受HiveConnection

中此错误的影响