1. 程式人生 > >二十四、併發程式設計之簡易資料連線池

二十四、併發程式設計之簡易資料連線池

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(); } } } }