????在Hbase中,許多基于列表的操作,如delete(List<Delete> deletes)和get(List<Get> gets),都是基于batch()方法實(shí)現(xiàn)的,它們都是為了方便用戶使用而對(duì)batch()方法進(jìn)行了包裝。下面是Hbase1.3.0中提供的batch()方法的簽名:
void batch(final List<? extends Row> actions,final Object[] results)throws InterruptedException,IOException;
Object[] batch(final List<? extends Row> actions)throws InterruptedException,IOException;
????事實(shí)上,在Hbase1.3.0 API中,上面兩個(gè)方法其實(shí)只是一個(gè)方法,其實(shí)現(xiàn)如下所示:
@Override
public void batch(final List<? extends Row> actions,final Object[] results)throws InterruptedException, IOException {
AsyncRequestFuture ars = multiAp.submitAll(pool, tableName, actions, null, results);
ars.waitUntilDone();
if (ars.hasError()) {
throw ars.getErrors();
}
}
@Override
public Object[] batch(final List<? extends Row> actions)throws InterruptedException, IOException {
Object[] results = new Object[actions.size()];
batch(actions, results);
return results;
}
????從上面的實(shí)現(xiàn)可以看出batch(fianl List<? extends Row> actions)方法是對(duì)batch(List<? extends Row> actions,final Object[] results)的進(jìn)一步包裝。
????為了安全起見(jiàn),不應(yīng)該將針對(duì)同一行的Put和Delete操作放在同一批次處理請(qǐng)求中,為了保證最好的性能,這些操作處理的順序可能不同,但是這樣會(huì)產(chǎn)生不可預(yù)知的結(jié)果。還有一個(gè)需要注意的是,當(dāng)使用batch()功能執(zhí)行批量put操作時(shí),Put實(shí)例不會(huì)被寫入到客戶端緩沖區(qū)中,batch()請(qǐng)求是同步的,會(huì)把操作直接發(fā)往服務(wù)器。