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();
}
答案 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)到池中。