为了理解连接池,所以自定义一个连接池:
三步:初始化的时候将一定数量的连接存放在集合中///从连接池中获取连接///将连接归还连接池
package web_database_demo.Datasuorce;
import web_database_demo.jdbc_until;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;
//理解连接池的原理——自定义连接池
public class ConnectionPool {
//获取三个连接——相连接池中存储三个连接
static LinkedList<Connection> pool = new LinkedList<Connection>();//定义集合来存储
static {// 初始化的时候就存储连接
for( int i =0; i<3 ;i++){
try {
Connection conn = jdbc_until.getConn();
pool.addLast(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//从连接池中获取一个连接
public Connection getConnection(){
if(pool.isEmpty()){
//如果获取连接的时候集合中没有连接,就再创建两个
for( int i =0; i<2 ;i++){
try {
Connection conn = jdbc_until.getConn();
pool.addLast(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Connection conn = pool.removeFirst();
System.out.println("从池中获取连接");
return conn;
}
//归还连接
public void addBack(Connection conn){
//只要将连接重新存储到集合的尾部
pool.addLast(conn);
System.out.println("归还连接");
}
}
自定义连接池的优化:不用新增的addBack 来归还连接,而是修改连接(Connection)的colse 方法,销毁连接变成归还连接
修改方法:
1.继承/实现 重写方法
2.装饰者模式(静态代理)
装饰者模式:
要修改的方法必定是装饰者与被修饰者共同具备的共性方法,或者是换一种说法,这就是为什么装饰者和被装饰者要实现或者是继承同一个接口或者方法的原因
使用要求
1.装饰者和被装饰者一定要实现同一个接口或者同一个类
为什么? 在装饰者类中才能有要装饰的方法,可以用被装饰者的引用接收装饰后的对象(装饰者的对象),使用修改的方法也完全没有问题
2.装饰者里面一定要有被装饰者的引用
为什么?才能使用被装饰者原来的方法
3.修改要修改的方法其余的使用原来的方法
优化过后的连接池:
package web_database_demo.Datasuorce;
import java.sql.*;
import java.util.LinkedList;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
//修改Connection的
public class ConnectionWarp implements Connection{
private Connection conn;
private LinkedList<Connection> list;
//传入被装饰者的引用
public ConnectionWarp(Connection conn,LinkedList<Connection> list){
this.conn=conn;
this.list=list;
}
@Override
public void close() throws SQLException {
//修改销毁,改为将连接归还到连接池
System.out.println("返回前"+list.size());
list.addLast(this); / /谁调用谁被归还
System.out.println("返回后"+list.size());
}
@Override
public Statement createStatement() throws SQLException {
return conn.createStatement();//不修改的方法就是用原本的方法
}
@Override
public PreparedStatement prepareStatement(String sql) throws SQLException {
return conn.prepareStatement(sql);
}
//在连接池中,将获取的连接传入装饰类装饰后,再返回//返回的是装饰后的对象(其实就是装饰类的对象),装饰类和被装饰的类一样有方法,并且修改了要修改的方法,不需要修改的方法就是被装饰者原来的方法,其实装饰类的对象就是一个进行对应修改的被装饰者的对象,可以这样理解和使用是因为:这里一个重要的前提就是装饰类和被装饰类实现的接口或者继承的类一样,并且要修改的方法是共性的方法
//在连接池中获取连接后装饰了在返回给调用者
Connection conn = new ConnectionWarp(pool.removeFirst(), pool);//将连接传入连接池中装饰后再返回
System.out.println("从池中获取连接");
return conn;