Channel
package com.njbdqn.services.utils; import org.apache.hadoop.hbase.client.Connection; /** * 數據庫連接對象包裝類,mysql自己有第三方連接池,hbase還沒有 */ public class Channel { private Connection conn; private boolean isbusy=false; public Connection getConn() { return conn; } public void setConn(Connection conn) { this.conn = conn; } public boolean isIsbusy() { return isbusy; } public void setIsbusy(boolean isbusy) { this.isbusy = isbusy; } }
CreateConnection
package com.njbdqn.services.utils; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class CreateConnection { static { init(); } private static void init() { for(int i = 0;i<3;i++){ Pool.mkChannel(); } } private static Connection conn; private static Connection getConnection(){ return Pool.getChannel().getConn(); } public static void destory(Connection conn){ Pool.destory(conn); } private static class Pool{ private static List<Channel> lst = new ArrayList<>(); private static int maxpool = 30; public static Channel mkChannel(){ Channel c = new Channel(); try { c.setConn(ConnectionFactory.createConnection()); } catch (IOException e) { e.printStackTrace(); } lst.add(c); return c; } // 拿管子 public static Channel getChannel(){ // 循環搜索是否有空閑連接 for(Channel ch:lst){ if(!ch.isIsbusy()){ ch.setIsbusy(true); return ch; } } // 能否開辟新管子 if(lst.size()<maxpool){ Channel ch = mkChannel(); ch.setIsbusy(true); return ch; } // 等待空閑管子,一段時間retry一次 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } return getChannel(); } // 釋放管子 public static void destory(Connection con){ for(Channel c:lst){ if(con == c.getConn()){ // 還需要判斷是否都能用,比如是否能連上查出來東西 c.setIsbusy(false); break; } } } } }