首先建立数据连接成(自己建立的)
/**
* 存在必要性?
* 数据库连接作为非常重要的资源 ,用完了要不要立即销毁?----(不能立即关闭)
* 不能立即关闭?谁维护
* ---------------专门交给一个人来管理(池-----------池子中放了好多数据库连接)
*
* 非常 有必要存在!!!
* 池子在java类中如何表现?--------------------集合--------(Connection)----用什么集合?
*
* List 集合来模拟池
* 1.初始化一些连接
*
* @author wangli
*
*/
public class MyDataSource1 {
private static List<Connection> pool = new ArrayList<Connection>();//池子
private static int size=10;
public static void setSize(int size) {
MyDataSource1.size = size;
}
//初始化池中的连接
static{
try {
for (int i = 0; i < size; i++) {
pool.add(JdbcUtil.getConnection());
}
} catch (Exception e) {
e.printStackTrace();
}
}
//统一提供方法,用于从池中获取连接
public static synchronized Connection getConnection(){
if(pool.size()>0){
Connection con = pool.remove(0);//删除这个连接,因为别人此时不能再用它
//真正开始包装 别人
MyConnection2 con2 = new MyConnection2(con,pool);
return con2;
}else{
throw new RuntimeException("池中无连接");
}
}
//还回一个连接到池中
public static void close(Connection con){
pool.add(con);//将这个连接回收到池中
}
//取池
public static List<Connection> getPool() {
return pool;
}
}
一、外包装和被包装实现一样的接口
public class ConnectionAdapter implements Connection {
}
二、
//包装模式 //似你
public class MyConnection2 extends ConnectionAdapter {
private Connection con;//还有你
private List<Connection> pool;
//拜托你
public MyConnection2(Connection con,List<Connection> pool){
this.con = con;
this.pool = pool;
}
@Override //改写它
public void close() throws SQLException {
pool.add(con);
}
}
三、test测试一下
/**
* @param args
*/
public static void main(String[] args) {
MyDataSource1 myds = new MyDataSource1();
System.out.println("初始化好了,池中连接数:"+myds.getPool().size());
Connection con = myds.getConnection();//从池中取一个连接
System.out.println("取出但未还,池中连接数:"+myds.getPool().size());
System.out.println("当前连接对象:"+con);
try {
con.close();//面向接口编程,con其实是MyConnection2 对象。调用的是MyConnection2 .close()既被包装后改写的close()方法。
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("用完后还了,池中连接数:"+myds.getPool().size());
}