数据库连接池的简单实现
package com.roy.pool;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class PoolConnection implements MyPoolConnection {
Lock lock = new ReentrantLock();
Condition a =lock.newCondition();
List<Connection> activeConnection = new CopyOnWriteArrayList<Connection>();
List<Connection> freeConnection = new CopyOnWriteArrayList<>();
AtomicInteger cout ;
public PoolConnection(){
cout = new AtomicInteger(0);
init();
}
private void init(){
for (int i =0;i<Integer.parseInt(PropertiesUtils.map.getProperty("initConnections"));i++){
Connection connection = newConnection();
if(connection!=null){
freeConnection.add(connection);
}
}
}
@Override
public Connection getConnetion() {
lock.lock();
Connection connection = null ;
try {
if (cout.get() < Integer.valueOf(PropertiesUtils.map.getProperty("maxConnections"))) {
if (freeConnection.size() > 0) {
connection = freeConnection.remove(0);
} else {
connection = newConnection();
}
if (isAvaliable(connection)) {
activeConnection.add(connection);
} else {
cout.decrementAndGet();
getConnetion();
}
} else {
a.await(Integer.parseInt(PropertiesUtils.map.getProperty("connTimeOut")), TimeUnit.SECONDS);
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
return connection;
}
@Override
public void releaseConnetion(Connection connection) {
lock.lock();
try {
if (isAvaliable(connection)) {
if (freeConnection.size() < Integer.valueOf(PropertiesUtils.map.getProperty("maxConnections"))) {
freeConnection.add(connection);
} else {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
activeConnection.remove(connection);
cout.decrementAndGet();
a.signalAll();
} else {
throw new RuntimeException("连接回收异常");
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public Connection newConnection(){
try {
Class.forName(PropertiesUtils.map.getProperty("driverName"));
Connection connection = DriverManager.getConnection(PropertiesUtils.map.getProperty("url"), PropertiesUtils.map.getProperty("userName"), PropertiesUtils.map.getProperty("password"));
cout.addAndGet(1);
return connection;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public boolean isAvaliable(Connection connection){
try {
if(null==connection||connection.isClosed());
return false;
} catch (SQLException e) {
e.printStackTrace();
}
return true;
}
}
driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
userName=root
password=root
minConnections=1
maxConnections=10
initConnections=5
connTimeOut=1000
maxActiveConnetions=10