Hbase利用HTablePool实现Htable连接池

之前通过直接new Htable方式对hbase表进行操作,会经常抛出NIOServerCnxn: Too many connections from /10.202.50.79 - max is 60 异常解决
最后经过分析为Htable创建过多,而每创建一个htable就会创建一个连接,进行htable.close()进行关闭连接,虽然会执行操作,但不会及时清除,所以会出现zookeeper抛出连接过多的异常
有个很笨的方式就是在程序最初只创建一个Htable对象,这样就不会出现上述异常,
后来想到可以用关系数据库连接池方式实现htable连接池,正要实现发现了HTablePool类,就直接调用该类实现了。
返回一个Htable对象代码如下:
        /**        
         * 返回htablepool连接池中的一个htable
         * @param tableName
         * @return
         */
        public static synchronized HTable getHtable(String tableName){
                if(hTablePool!=null)
                        return (HTable) hTablePool.getTable(tableName);//如果hTablePool对象已经存在,直接取出一个htable
                else{//        hTablePool不存在则先new一个htablepool对象,然后再取                
                        String servicepath = HbaseService.class.getResource("").getPath()+"service.properties";
                        Configuration configuration = HBaseConfiguration.create();
                        configuration.set("hbase.master",  PropertyUtil.getValue(servicepath, "hbase.master"));
                        configuration.set("hbase.zookeeper.quorum", PropertyUtil.getValue(servicepath, "hbase.zookeeper.quorum"));
                        configuration.set("hbase.zookeeper.property.clientPort", PropertyUtil.getValue(servicepath, "hbase.zookeeper.property.clientPort"));
                        configuration.get("hbase.master");
                        hTablePool=new HTablePool(configuration,POOL_MAX_SIZE);//注意这个值设置的是每个htable表在pool中的最大值
                        return (HTable) hTablePool.getTable(tableName);
                }
        }

你可能感兴趣的:(hbase,数据库连接池,string,null,cloudera,hadoop,hbase,zookeeper,hive)