2012-08-30 19 views
4

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

以下是什么正确的用法?

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

HTablePool在hbase 0.98中已弃用,请参阅[此链接](http://apache-hbase.679495.n3.nabble.com/Heads-up-HTablePool-will-be-deprecated-in-0- 94-0-95-0-96-and-removed-in-0-98-td4048783.html) – Jack47

回答

4

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

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

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的权威指南”。

编辑:我V0.92状态后错DOC:)

不需要这种方法了,客户应致电HTableInterface.close(而不是返回表到池中一旦你完成通过调用HTableInterface.close()来关闭HTableInterface的实例,而不是使用puttable(HTableInterface)将表返回到池中。

+0

你错了......检查Javadoc http://hbase.apache.org/apidocs/org/apache/ hadoop/hbase/client/HTablePool.html –

+0

是的,已经编辑过,他们在0.92之后改变了它,并且没有看到它们扩展了HTable的PoolHTable实现。 – seb