动态代理实现连接池(初始化 从连接池中取和归还)
1.连接JDBC的Connection池(连接池)
public class MyConnectionPool {
// 准备一个容器 用于存储多个连接对象
private static LinkedList<Connection> pool ;
// 初始化容器
static{
// 加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
pool=new LinkedList<Connection>();
// 预先向连接池中放入5个连接对象
for (int i = 0; i <5 ; i++) {
Connection connection = initConnection();
if(null!= connection){
System.out.println("成功初始化一个连接对象并放入了连接池");
pool.add(connection);
}
}
}
//用于初始化连接对象 Connection对象 或者是 Connetion的代理对象
private static Connection initConnection(){
try {
Connection conn =DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false","root","root");
// 使用jdk Proxy 动态代理技术 增强 conn 对象的 close 让close 方法具备将连接对象规划到连接池的功能
//参数1 类加载器 参数2 被代理对象实现的所有的接口的字节码数组 参数3 执行处理器 用于定义方法的增强规则(加强后的方法)
Connection connProxy= (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
Object res =null;
// 定义增强规则
// 如果调用的是 close方法 进行增强
if(method.getName().equals("close")){
if(pool.size()<10){
System.out.println("连接池未满 将连接对象归还到连接池中");
pool.addLast((Connection)o);
}else{
System.out.println("连接池满了 直接关闭连接对象");
conn.close();
}
}else{// 如果是其他方法 不加强 正常执行
res =method.invoke(conn,objects);
}
return res;
}
});
return connProxy;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//负责向外界提供 Connection 对象 Connection对象 或者是 Connetion的代理对象
public static Connection getConnection(){
// 如果连接池中 有连接对象 从连接池中取出
if(pool.size()>0){
System.out.println("连接池中还有对象 从连接池中获取连接对象");
Connection connection = pool.removeFirst();
return connection;
}else{
System.out.println("连接池中没有对象 重新初始化一个连接对象并返回");
// 如果连接池中的对象已经被全部取出了 重新初始化一个 连接对象
Connection connection = initConnection();
return connection;
}
}
}
2.初始化连接池 获取连接池 归还连接池里的对象
public class TestConnectionPool {
public static void main(String[] args) throws SQLException {
for (int i = 1; i <=2 ; i++) {
Connection connection1 = MyConnectionPool.getConnection();
Connection connection2 = MyConnectionPool.getConnection();
Connection connection3 = MyConnectionPool.getConnection();
Connection connection4 = MyConnectionPool.getConnection();
Connection connection5 = MyConnectionPool.getConnection();
Connection connection6 = MyConnectionPool.getConnection();
Connection connection7 = MyConnectionPool.getConnection();
Connection connection8 = MyConnectionPool.getConnection();
Connection connection9 = MyConnectionPool.getConnection();
Connection connection10 = MyConnectionPool.getConnection();
Connection connection11 = MyConnectionPool.getConnection();
Connection connection12 = MyConnectionPool.getConnection();
connection1.close();//有代理对象归还的方式
connection2.close();
connection3.close();
connection4.close();
connection5.close();
connection6.close();
connection7.close();
connection8.close();
connection9.close();
connection10.close();
connection11.close();
connection12.close();
}
}
}