package com.embracesource.jmeter.hbase;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.HTableFactory;
import org.apache.hadoop.hbase.client.HTableInterface;
import org.apache.hadoop.hbase.client.HTablePool;
/**
* 双重检查加锁 单例模式
*
* @author allen
*
*/
public class JMeterHTablePool {
public static HTablePool tablePool = null;
private static JMeterHTablePool instancePool;
private JMeterHTablePool(Configuration config, int poolsize, byte[] tableName,
final boolean autoFlush, final long writeBufferSize) {
tablePool = new HTablePool(config, poolsize, new HTableFactory() {
@Override
public HTableInterface createHTableInterface(Configuration config, byte[] tableName) {
try {
HTable hTable = new HTable(config, tableName);
hTable.setAutoFlush(autoFlush);
hTable.setWriteBufferSize(writeBufferSize);
return hTable;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void releaseHTableInterface(HTableInterface table) throws IOException {
table.flushCommits();
super.releaseHTableInterface(table);
}
});
}
public static JMeterHTablePool getinstancePool(Configuration config, int poolSize,
byte[] tableName, final boolean autoFlush, final long writeBufferSize) {
if (instancePool == null) {
synchronized (JMeterHTablePool.class) {
if (instancePool == null) {
System.out.println("Pool instance");
instancePool =
new JMeterHTablePool(config, poolSize, tableName, autoFlush, writeBufferSize);
}
}
}
return instancePool;
}
@SuppressWarnings("deprecation")
public synchronized void flush(String tableName) throws IOException {
HTableInterface hTable = tablePool.getTable(tableName);
try {
hTable.flushCommits();
} finally {
if (hTable != null) {
tablePool.putTable(hTable);
}
}
}
public synchronized void close() throws IOException {
tablePool.close();
}
public synchronized void close(String tableName) throws IOException {
tablePool.closeTablePool(tableName.getBytes());
}
}