动态代理练习3自定义数据库连接池[connection动态代理]

自定义数据库连接池[connection动态代理]

  

1、代理类

 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3 import java.lang.reflect.Proxy;
 4 import java.sql.Connection;
 5 import java.sql.DriverManager;
 6 import java.sql.SQLException;
 7 import java.util.LinkedList;
 8 
 9 //    自定义连接池
10 public class Pool {
11 
12     private static LinkedList<Connection> linkedList = new LinkedList<Connection>();
13     static{
14 //        在加载Pool类时,创建10个连接,并加入到连接池中
15         for (int i = 0; i < 10; i++) {
16             try {
17                 Class.forName("com.mysql.jdbc.Driver");
18                 String url = "jdbc:mysql://localhost:3306/bbs";
19                 String user = "root";
20                 String password = "123456";
21                 Connection conn = DriverManager.getConnection(url, user, password);
22 //                将连接添加到末尾
23                 linkedList.addLast(conn);
24             } catch (ClassNotFoundException e) {
25                 e.printStackTrace();
26             } catch (SQLException e) {
27                 e.printStackTrace();
28             }
29         }
30     }
31 //    取得连接池中连接的个数
32     public int getSize(){
33         return linkedList.size();
34     }
35 //    取得一个空闲的连接,只能返回Connection的动态代理对象
36     public Connection getConnection(){
37         final Connection conn =linkedList.removeFirst();
38         Class<?>[] interfaces =conn.getClass().getInterfaces();
39         for(Class<?> clazz:interfaces){
40             System.out.println(clazz.getName());
41         }
42         return (Connection) Proxy.newProxyInstance(
43                 Pool.class.getClassLoader(), 
44                 new Class[]{Connection.class}, 
45                 new InvocationHandler() {
46                     
47                     public Object invoke(Object proxy, Method method, Object[] args)
48                             throws Throwable {
49                         
50 //                        如果调用的是close()方法
51                         if("close".equals(method.getName())){
52 //                            将连接放回连接池
53                             linkedList.addLast(conn);
54 //                            放回null
55                             return null;
56                         }else{
57                             return method.invoke(conn, args);
58                         }
59                     }
60                 });
61     }
62     
63 //    返回真实的Connection
64     /*public Connection getConnection(){
65         Connection conn = linkedList.removeFirst();
66         return conn;//返回真实的Connection
67     }*/
68     
69 }

2、测试类

 1 import java.sql.Connection;
 2 import java.sql.SQLException;
 3 
 4 public class TestPool {
 5 
 6     public static void main(String[] args) throws SQLException {
 7         
 8 //        创建连接池
 9         Pool pool = new Pool();
10 //        取得连接池中的连接个数
11         System.out.println("连接个数为:"+pool.getSize());
12 //        取得一个空闲的连接
13         Connection conn = pool.getConnection();
14 //        取得连接池中的连接个数
15         System.out.println("连接个数为:"+pool.getSize());
16 //        关闭连接对象,本质是将连接放回连接池
17         conn.close();
18         System.out.println("连接个数为:"+pool.getSize());
19     }
20 
21 }
原文地址:https://www.cnblogs.com/hacket/p/3053504.html