What is the correct usage pattern of HTablePool? I mean, assume that I have my DAO which is initialised with an instance of HTablePool. This DAO is a member instance of a Stateless Session Bean so it is reused between invocations.
What is the correct usage beween the following?
private HTableInterface aTable;
public XYZDAO(final HTablePool pool)
{
this.aTable = pool.getTable(...);
}
public void doSomething(...)
{
aTable.get(...)
}
or HTablePool should be used like a Datasource and therefore is more appropriate a usage like this
private HTablePool datasource;
public XYZDAO(final HTablePool pool)
{
this.datasource = pool;
}
public void doSomething(...)
{
HTableInterface aTable = datasource.getTable(...);
aTable.get(...);
aTable.close();
}
Yes the second approach is better
but rather than closing the Table you should put it back in to the pool:Example Code taken from the Book "HBase: The Definitive Guide".
EDIT: I'm wrong doc after v0.92 states:
The second approach is the best, you should use
HTablePool
like it was aDatasource
since theHTable
class is not thread safe. A call to theclose
method ofHTableInterface
will automatically return the table to the pool.Note that there is
HConnection
interface that replaces the deprecatedHTablePool
in newer HBase versions.