您的位置:首页 > 其它

使用包装设计模式,实现标准连接池

2014-02-19 19:21 274 查看
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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: