对于共享资源,有一个很著名的设计模式:
资源池(ResourcePool)。
该模式正是为了解决资源的频繁分配﹑释放所造成的问题。
为解决每一次请求都要创建一次数据库连接,可以采用数据库连接池技术。
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。
预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。
那麽要做好一个规范的数据源(缓冲池),就需要实现DataSource接口中的一些方法:
如下:
一,在自己写 连接池 之前,应该先为其做好准备,要用到Connection中的方法,但需要有为接下来的“缓冲池”,自己的方法,那麽就要自己定义一个类MyConnection实现Connection
/** * 装饰模式的使用com.mysql.jdbc.Connection具体类 * @author beiwo * *
1.编写一个类,实现与被装饰器类相同的接口,装饰器类和被装饰器类有着相同的方法 *
2.定义一个变量,引用被装饰器类的实例 *
3.定义构造方法,把被装饰类的实例传递进来,装饰器类就获得了被装饰类的实例 *
4.对应需要重写的方法,你自己写你需要的实现 *
5.对于不需要重写的方法,调用原来被装饰对象的对应方法就行。
*/
public class MyConnection implements Connection{ //1
private List<Connection> pool;
private Connection conn; //2 com.mysql.jdbc.Connection
//3
public MyConnection(List<Connection>pool, Connection conn) {
super();
this.pool = pool;
this.conn = conn;
}
//4
@Overridepublic void close() throws SQLException {
pool.add(conn);
}
//5
@OverridepublicT unwrap(Classiface) throws SQLException {
return conn.unwrap(iface);
}
}
二:开始建连接池
public class MyDataSource implements DataSource{
//Collections.synchronizedList,把集合对象变成线程安全的模式private static private static List<Connection>pool=Collections.synchronizedList(new ArrayList());
static{
try {
for (int i = 0; i <10; i++) {
Connection conn=DBUtil.getConn();
pool.add(conn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Connection getConnection() throws SQLException {
if(pool.size()>0){
Connection conn=pool.remove(0);
MyConnection myConn=new MyConnection(pool, conn);
return myConn;
}else{
throw new RuntimeException("连接用完");
}
}
}