版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29479041/article/details/85122557
public class MyDataSource {
private LinkedList<Connection> pool = new LinkedList(); //链表放连接池用
private static final int INIT_CONNECTIONS = 10;//初始化连接数
private static final String DRIVER_CLASS="com.mysql.jdbc.Driver";//驱动
private static final String USER="";//用户
private static final String PASSWORD="";// 密码
private static final String URL="";//地址
private Lock lock = new ReentrantLock();
Condition c1 = lock.newCondition();
static {
try {
Class.forName(DRIVER_CLASS);//加载驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public MyDataSource() {
for(int i =0; i<INIT_CONNECTIONS;i++) {
try {
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);//创建连接
pool.addLast(conn);//将连接放进连接池
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//获取连接
public Connection getConnect() {
Connection result = null;
lock.lock();
try {
while(pool.size()<=0) {//如果连接池里的连接小于等于0,就得让获取连接的线程等待
try {
c1.await();//让获取连接的线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(!pool.isEmpty()) {//连接池不为空
result = pool.removeFirst();//拿到第一个连接
}
return result;
}finally {
lock.unlock();
}
}
//释放连接
public void release(Connection conn) {
if(conn != null) {
lock.lock();
try {
pool.addLast(conn);//将连接放回到连接池
c1.signal();//叫醒获取连接的线程
}finally {
lock.unlock();
}
}
}
}