在Hbase中,许多基于列表的操作,如delete(List<Delete> deletes)和get(List<Get> gets),都是基于batch()方法实现的,它们都是为了方便用户使用而对batch()方法进行了包装。下面是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中,上面两个方法其实只是一个方法,其实现如下所示:
@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;
}
从上面的实现可以看出batch(fianl List<? extends Row> actions)方法是对batch(List<? extends Row> actions,final Object[] results)的进一步包装。
为了安全起见,不应该将针对同一行的Put和Delete操作放在同一批次处理请求中,为了保证最好的性能,这些操作处理的顺序可能不同,但是这样会产生不可预知的结果。还有一个需要注意的是,当使用batch()功能执行批量put操作时,Put实例不会被写入到客户端缓冲区中,batch()请求是同步的,会把操作直接发往服务器。