public class MyDataSource implements DataSource{
private LinkedList<Connection> pool = new LinkedList<Connection>();
public MyDataSource() {
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/oa";
String username = "root";
String password = "root";
try {
Class.forName(driverClassName);
for(int i=0; i<3; i++){
Connection conn = DriverManager.getConnection(url, username, password); // conn-->com.mysql.jdbc.Jdbc4Connection@df255
// 對上述conn,進行包裝。myConnection-->standardConnPool.MyDataSource$MyConnection@1e13d52
MyConnectionWrapper myConnection = new MyConnectionWrapper(conn);
// 將包裝的Connection類,放入到pool中
pool.add(myConnection);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
synchronized (pool) {
// 如果線程池中的Connection大小爲0,等待
if(pool.size() == 0){
try {
pool.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
return getConnection();
}
Connection conn = pool.removeFirst();
System.out.println("size :" + pool.size() + " " + conn);
return conn;
}
}
/**
* 內部類,對Connection進行包裝。重寫close方法
* @author zhurudong
*
*/
class MyConnectionWrapper implements Connection {
private Connection connection;
public MyConnectionWrapper(Connection connection) {
this.connection = connection;
}
public void close() throws SQLException {
synchronized (pool) {
System.out.println("對象:" + this + " 關閉連接");
// 把要關閉連接的對象,重新放回pool中。喚醒正在wait的線程
pool.add(this);
pool.notify();
}
}
使用包裝設計模式,實現標準連接池
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.