Hbase 1.0.0连接池

时间:2015-09-14 21:22:08

标签: java multithreading hbase

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

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

一般情况下,由于连接对象太重,创建连接池是个好主意吗?

有没有人有任何想法?

2 个答案:

答案 0 :(得分:3)

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

中的AdminConnection
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")){
  ...
} 

答案 1 :(得分:3)

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

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

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

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