????在Hbase中,許多基于列表的操作,如delete(List<Delete> deletes)和get(List<Get> gets),都是基于batch()方法實現(xiàn)的,它們都是為了方便用戶使用而對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;
????事實上,在Hbase1.3.0 API中,上面兩個方法其實只是一個方法,其實現(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;
}
????從上面的實現(xiàn)可以看出batch(fianl List<? extends Row> actions)方法是對batch(List<? extends Row> actions,final Object[] results)的進(jìn)一步包裝。
????為了安全起見,不應(yīng)該將針對同一行的Put和Delete操作放在同一批次處理請求中,為了保證最好的性能,這些操作處理的順序可能不同,但是這樣會產(chǎn)生不可預(yù)知的結(jié)果。還有一個需要注意的是,當(dāng)使用batch()功能執(zhí)行批量put操作時,Put實例不會被寫入到客戶端緩沖區(qū)中,batch()請求是同步的,會把操作直接發(fā)往服務(wù)器。