HBase HTablePool:正确用法

时间:2012-08-30 06:09:06

标签: connection-pooling hbase

HTablePool的正确使用模式是什么?我的意思是,假设我的DAO是用HTablePool实例初始化的。此DAO是无状态会话Bean的成员实例,因此它在调用之间重用。

以下内容之间的正确用法是什么?

private HTableInterface aTable;

public XYZDAO(final HTablePool pool)
{
    this.aTable = pool.getTable(...);
}

public void doSomething(...)
{
    aTable.get(...)
}

或HTablePool应该像数据源一样使用,因此更适合像这样的用法

private HTablePool datasource;

public XYZDAO(final HTablePool pool)
{
    this.datasource = pool;
}

public void doSomething(...)
{
    HTableInterface aTable = datasource.getTable(...);
    aTable.get(...);
    aTable.close();
}

2 个答案:

答案 0 :(得分:4)

第二种方法是最好的,您应该使用HTablePool,因为它是Datasource,因为HTable类不是线程安全的。调用close HTableInterface方法会自动将表格返回到池中。

请注意,HConnection接口可替换较新的HBase版本中已弃用的HTablePool

答案 1 :(得分:1)

是的,第二种方法是更好的,而不是关闭表,你应该把它放回池

public void createUser(String username, String firstName, String lastName, String email,    String password, String roles) throws IOException {
    HTable table = rm.getTable(UserTable.NAME);
    Put put = new Put(Bytes.toBytes(username)); put.add(UserTable.DATA_FAMILY,  UserTable.FIRSTNAME,
    Bytes.toBytes(firstName));
    put.add(UserTable.DATA_FAMILY, UserTable.LASTNAME, Bytes.toBytes(lastName));
    put.add(UserTable.DATA_FAMILY, UserTable.EMAIL, Bytes.toBytes(email));
    put.add(UserTable.DATA_FAMILY, UserTable.CREDENTIALS,
    Bytes.toBytes(password));
    put.add(UserTable.DATA_FAMILY, UserTable.ROLES, Bytes.toBytes(roles)); table.put(put);
    table.flushCommits();
    rm.putTable(table);
}

示例代码取自“HBase:The Definitive Guide”一书。

编辑:我在v0.92之后的错误文档:

  

不再需要此方法,客户端应调用HTableInterface.close()而不是将表返回到池完成后,通过调用HTableInterface.close()而不是返回表来关闭HTableInterface的实例使用(已弃用)putTable(HTableInterface)到池中。