连接池工具类
public class MyDBPool{
//独占锁
private static ReentrantLock lock = new ReentrantLock();
//定义连接池中连接对象的存储容器【线程安全】
private static List<MyConnection> list = Collections.synchronizedList(new ArrayList<>());
//定义数据库连接属性
private final static String DRIVER_CLASS = "jdbc.driver_class";
private final static String URL = "jdbc.url";
private final static String USERNAME = "jdbc.username";
private final static String PASSWORD = "jdbc.password";
//定义默认连接池属性配置
private final static int initSize = 2;
private final static int maxSize = 4;
private final static int stepSize = 1;
private final static int timeout = 2000;
//初始化连接池
static{
try {
//加载驱动
Driver driver = (Driver) Class.forName(DRIVER_CLASS).newInstance();
//使用DriverManager注册驱动
DriverManager.registerDriver(driver);
//初始化连接
createConnection(initSize);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
MyConnection poolConnection = null;
try{
lock.lock();
//连接池对象为空时,初始化连接对象
if(list.size() == 0){
createConnection(initSize);
}
//获取可用连接对象
poolConnection = getAvailableConnection();
//没有可用连接对象时,等待连接对象的释放或者创建新的连接对象使用
while(poolConnection == null){
System.out.println("---------------等待连接---------------");
createConnection(stepSize);
poolConnection = getAvailableConnection();
if(poolConnection == null){
TimeUnit.MILLISECONDS.sleep(30);
}
}
}catch(Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
return poolConnection;
}
//创建数据库连接
private static void createConnection(int count) throws SQLException{
if(list.size() + count <= maxSize){
for(int i = 0; i < count; i++){
System.out.println("初始化了"+ (i + 1) +"个连接");