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