当我尝试以这种方式创建HTable实例时。

Configuration conf = HBaseConfiguration.create();
HConnection conn = HConnectionManager.getConnection(conf);
conn.getTable("TABLE_NAME");

然后我得到一个异常(exception)。
    @Override
    public HTableInterface getTable(TableName tableName, ExecutorService pool) throws IOException {
      if (managed) {
        throw new IOException("The connection has to be unmanaged.");
      }
      return new HTable(tableName, this, pool);
    }

所以,我想知道托管和“非托管” Hconnection的具体体现吗?

最佳答案

在调用HConnectionManager.getConnection之前,您必须使用HConnectionManager.createConnection传递给先前创建的HBaseConfiguration实例来创建连接。 HConnectionManager.getConnection返回连接已经存在。有关如何处理连接池的一些HConnectionManager javadoc:



在您的情况下,您可以简单地使用HConnectionManager.createConnection创建连接,并使用返回的连接来打开HTable
编辑:

@ifiddddddbest,我找到了HConnectionImplementation的javadocs,其中包含托管标志的描述(也许可以帮助您理解):



在较新版本的HBase(> 1.0)中,托管标志消失了,所有连接管理现在都在客户端上,例如客户端负责关闭它,如果这样做,它会关闭与ZK,与HBase主站等的所有内部连接,不仅会减少引用计数器。

09-11 18:11