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