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;
}
}
}
}
}