当我尝试以这种方式创建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主站等的所有内部连接,不仅会减少引用计数器。