官网
hbase有两种获得connection的方法,分别是如下两种:
Connection connection = ConnectionFactory.createConnection(conf);
Connection connection = HConnectionManager.createConnection(conf);
这两种方法还有重载方法,在重载方法里可以传递两个参数,第二个参数ExecutorService,这个参数可以覆盖掉默认的线程池,具体的使用方式如下:
public class HbaseConnectionGenerator {
private HbaseConnectionGenerator() {//私有化构造方法,让用户不能new这个类的对象
}
private static HConnection connection = null;//要创建的connection
public static synchronized HConnection getConnection() {
if (null == connection){
if (null == connection) {//空的时候创建,不为空就直接返回;典型的单例模式
Configuration conf = HBaseConfiguration.create();
String zkHost = "mpc5:2181,mpc6:2181,mpc7:2181";
conf.set("hbase.zookeeper.quorum", zkHost);
ExecutorService pool = Executors.newFixedThreadPool(10);//建立一个数量为10的线程池
try {
connection = HConnectionManager.createConnection(conf, pool);//用线程池创建connection
} catch (IOException e) {
e.printStackTrace();
}
}
}
return connection;
}
}
一个应用(进程)对应着一个connection,每个应用里的线程通过调用coonection的getTable方法从connection维护的线程池里获得table实例,按官方的说法,这种方式获得的table是线程安全的。每次table读写之后应该把table close掉,整个进程结束的时候才把connection close掉。