1、 实现途径:
编写JdbcPool implements java.sql.DataSource类
l 静态初始化块
l getConnection()
l release()
总结:
可以解决连接池的实现问题,但是必须要求编程人员熟悉JdbcPool的使用
解决此问题的方法——增强Connection的功能
2、 方案列表:
1) 编写Connection的子类,此方法理论上可以解决,但是没有可操作性,因为基本无法实现对Connection对象的初始化工作
2) 采用装饰模式
装饰模式解决方案
用包装设计模式对connnction的close方法进行增强
1.写一个类实现与被增强对象相同的接口
2.在类中定义一个变量记住被增强对象
3.在类中定义一个构造函数,接收被增强对象
4.覆盖想增强的方法
5.对于不想增强的方法,直接调用目标对象(被增强对象)的方法
总结:
装饰模式可以很好的解决问题,但是在此任然不合适,因为Connection接口中定义了太多的方法,逐个去实现非常繁琐。
3) 动态代理技术实现
public Connection getConnection() throws SQLException {
if(list.size()>0){
final Connection conn = list.removeFirst(); //mysql
System.out.println("用户从池中拿走了:" + conn);
System.out.println("池的大小为" + list.size());
//myconnection preparedstatement commit close
return (Connection)Proxy.newProxyInstance(JdbcPool.class.getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(!method.getName().equalsIgnoreCase("close")){
return method.invoke(conn, args);
}
System.out.println(conn + "被还到池中了");
list.add(conn);
System.out.println("池的大小为" + list.size());
return null;
}
});
/* MyConnection myconn = new MyConnection(conn,list);
return myconn; // conn = pool.getConnection(); conn.preparedstatment conn
*/ }else{
throw new RuntimeException("对不起,数据库忙,请等会再来!!");
}
}
数据连接池的基本实现 .
最新推荐文章于 2024-10-14 22:42:36 发布