package com.db;
import com.mysql.jdbc.Connection;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ConcurrentLinkedQueue;public classDbPool {private static String PROP_PATH = "db.properties";private static String max = null;private static String min = null;private static int poolSize = 0; //记录连接池中的数量
privateDbPool(){}//private static List pool = Collections.synchronizedList(new LinkedList());//让LinkedList变成线程安全的
private static ConcurrentLinkedQueue pool = new ConcurrentLinkedQueue();//更加高效的线程安全容器
static{if (poolSize == 0 &&pool.isEmpty()) {
synchronized (DbPool.class) {if (poolSize == 0 &&pool.isEmpty()) {try{
System.out.println("连接池为空,初始化");
InputStreamin = DbUtil.class.getClassLoader().getResourceAsStream(PROP_PATH);
Properties props= newProperties();
props.load(in);
max= props.getProperty("max");
min= props.getProperty("min");for (int i = 0; i < Integer.parseInt(min); i++) {
pool.add(DbUtil.getConnection());
poolSize++;
}
}catch(IOException ex) {
ex.printStackTrace();
}
}
}
}
}public staticConnection getConnection() {try{if (!pool.isEmpty()) {
System.out.println("连接池非空,直接返回");//return (pool).removeFirst();
returnpool.remove();
}else{
System.out.println("连接池为空,进行扩容");
expland(5);
System.out.println("等待获取");while (true) {if (!pool.isEmpty()) {
System.out.println("获取成功,返回");//return pool.removeFirst();
returnpool.remove();
}
}
}
}catch(Exception ex) {
ex.printStackTrace();return null;
}
}/**
* 销毁连接池*/
public static voiddistory(){for(Connection conn : pool) {try{
conn.close();
pool.remove(conn);
}catch(SQLException e) {
e.printStackTrace();
}
}
poolSize= 0;
System.out.println("销毁成功,未使用:" + getAvaliableSize() + "总数:" +getPoolSize());
}/**
* 回收连接
* @param conn*/
public static voidrecycle(Connection conn){
pool.add(conn);
System.out.println("回收成功,未使用:" + getAvaliableSize() + "总数:" +getPoolSize());
}/**
* 获取当前连接池有多少个连接,包括已使用和未使用
* @return*/
public static intgetPoolSize(){returnpoolSize;
}/**
* 获取未使用的数量
* @return*/
public static intgetAvaliableSize(){returnpool.size();
}/**
* 线程池扩容
* @num 增加的数量*/
private static void expland(intnum) {if (poolSize >Integer.parseInt(max)) {
System.out.println("总连接数量大于最大值,直接返回");return;
}for (int i=0; i
pool.add(DbUtil.getConnection());
poolSize++;
}
System.out.println("扩容成功,未使用:" + getAvaliableSize() + "总数:" +getPoolSize());
}
}