代理写标准连接池

 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     }

原文地址:https://www.cnblogs.com/liuwt365/p/4108078.html