1 //实现DataSource接口 2 public class MyConn implements DataSource { 3 //声明池管理对象 4 private LinkedList<Connection> pool =new LinkedList<Connection>(); 5 //在构造函数中初始化,创建多个连接 6 public MyConn() 7 { 8 try { 9 Class.forName("com.mysql.jdbc.Driver"); 10 String url="jdbc:mysql://localhost:3306/jdbcdb"; 11 for(int i=0;i<3;i++) 12 { 13 final Connection conn =DriverManager.getConnection(url,"root","mysql"); 14 15 Object ProxyedConn= Proxy.newProxyInstance( 16 MyConn.class.getClassLoader(), //类加载器 17 new Class[]{Connection.class}, //被代理类的父接口 18 new InvocationHandler() { //句柄,获取代理类的方法 19 public Object invoke(Object proxyedConnection, Method method, Object[] args) 20 throws Throwable { 21 22 if(method.getName().equals("close")) 23 { 24 synchronized (pool) { 25 pool.addLast((Connection)proxyedConnection); 26 pool.notify(); 27 } 28 return null; 29 } 30 //目标方法的返回值 31 Object returnValue=method.invoke(conn, args);//conn,你要代理的对象 32 return returnValue; 33 } 34 }); 35 36 pool.add((Connection)ProxyedConn); 37 } 38 } catch (Exception e) { 39 e.printStackTrace(); 40 } 41 } 42 43 public Connection getConnection() throws SQLException { 44 45 synchronized (pool) { 46 if(pool.size()==0)//池中是否还有连接,如果没有等待 47 { 48 try { 49 pool.wait(); 50 } catch (InterruptedException e) { 51 e.printStackTrace(); 52 } 53 return getConnection();//递归 54 } 55 56 Connection conn= pool.removeFirst();//移除第一个 57 return conn; 58 } 59 60 }
时间: 2024-11-05 17:27:20