动态代理实现连接池

动态代理实现连接池(初始化  从连接池中取和归还)

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();
        }
    }
}

发布了53 篇原创文章 · 获赞 0 · 访问量 1677

猜你喜欢

转载自blog.csdn.net/weixin_45450428/article/details/102862550