Hbase 1.0.0连接池

Hbase 1.0.0 connection pool

由于 Hbase 1.0+ API 没有使用 HConnection 处理连接池,我想知道创建连接池的最佳实践是什么?

到目前为止,我已经创建了一个 Connection object as ThreadLocal,但我不确定这是否是个好主意。

一般来说,既然连接对象这么重,创建一个连接池是个好主意吗?

有人知道吗?

您可以为每个应用程序使用一个连接,因为创建它很繁重而且 thread-safe。但是请确保关闭从 Connection

获得的 TableAdmin
private static class ConnectionHolder{
  private final Connection connection;

  private ConnectionHolder(){
   connection = ConnectionFactory.createConnection(config); 
  }

 Connection getConnection(){
  return connection;
  }
}

如果您使用此方法,请不要公开 connection 以免调用者意外关闭它。但是记得关闭 TablesResultScanners

Table getTable(String name){
  Table table = connection.getTable(TableName.valueOf(name));
  return table;
}

try(Table table = getTable("tableName")){
  ...
} 

我已经问过 Carter Page 的问题,这是他的回答:

“您不必为每个应用程序只使用一个连接,在某些特定情况下,您可能会发现需要多个连接。

一般来说,需要知道的重要一点是连接是 "heavy" 创建成本高昂但线程安全的对象。 Table、Admin 和 BufferedMutatator 对象是轻量级的,不一定是线程安全的。 连接对象不一定转换为单个 "connection",并且可以在幕后多路复用。最好把它想象成一个工厂。

我建议您尽可能创建单个连接,如果您认为更多工厂会提高性能,请仔细测试增加池。当然没有禁止拥有更多 Connection 对象的规则。这只是潜在的不必要开销的问题。希望这会有所帮助。"