二十四、併發程式設計之簡易資料連線池
阿新 • • 發佈:2019-01-03
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();
}
}
}
}