使用代理创建连接池 proxyPool

Posted 付吉龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用代理创建连接池 proxyPool相关的知识,希望对你有一定的参考价值。

配置文件properties

 1 url=jdbc:mysql://127.0.0.1:3306/mine?characterEncoding=UTF-8

2 user=root

3 password=1234

4 driverClass=com.mysql.jdbc.Driver 

主要代码

 1 package JDBCUtils;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.lang.reflect.InvocationHandler;
 6 import java.lang.reflect.Method;
 7 import java.lang.reflect.Proxy;
 8 import java.sql.Connection;
 9 import java.sql.DriverManager;
10 import java.util.LinkedList;
11 import java.util.Properties;
12 /**
13  * 使用代理创建连接池
14  * @author ASUS
15  *
16  */
17 public class ProxyConnUtils {
18 
19     private static LinkedList<Connection> pool =  new LinkedList<>();
20     private static String url;
21     private static String user;
22     private static String password;
23     private static String driverClass;
24     //private static Connection conn;
25     static{
26         try {
27             Properties properties = new Properties();
28             InputStream in = ProxyConnUtils.class.getResourceAsStream("/db.properties");
29             properties.load(in);
30             url = properties.getProperty("url");
31             System.err.println(url);
32             user = properties.getProperty("user");
33             password = properties.getProperty("password");
34             driverClass = properties.getProperty("driverClass");
35             Class.forName(driverClass);
36             for(int i = 0;i<3;i++){
37                 final Connection conn = DriverManager.getConnection(url, user, password);
38                 //对connection做代理
39                 Object connProxy = Proxy.newProxyInstance(ProxyConnUtils.class.getClassLoader(),
40                     new Class[]{Connection.class},
41                     new InvocationHandler() {
42                         
43                         @Override
44                         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
45                             //判断是否是close方法   回收连接
46                             if(method.getName().equals("close")){
47                                 synchronized (pool) {
48                                     System.err.println("不能关闭");
49                                     pool.addLast((Connection) proxy);
50                                     pool.notify();
51                                     return null;
52                                 }
53                             }else{
54                                 //若果调用的不是close方法  直接放行
55                                 return method.invoke(conn, args);
56                             }
57                         }
58                     });
59                 // 将代理对象添加到池中去
60                 pool.add((Connection) connProxy);
61             }
62         } catch (Exception e) {
63             e.printStackTrace();
64             throw new RuntimeException(e);
65         } 
66     }
67     
68     //获取connection连接
69     public static Connection getConnection(){
70         synchronized (pool) {
71             if(pool.size() == 0){
72                 try {
73                     pool.wait();
74                 } catch (Exception e) {
75                     e.printStackTrace();
76                     throw new RuntimeException(e);
77                 }
78             }
79             Connection connection = pool.removeFirst();
80             return connection;
81         }
82     }
83 }

测试代码

 1 package JDBCTest;
 2 import java.sql.Connection;
 3 import java.sql.Statement;
 4 import java.util.Scanner;
 5 import JDBCUtils.ConnUtil;
 6 import JDBCUtils.ConnUtils;
 7 import JDBCUtils.ProxyConnUtils;
 8 public class Demo01_tx3 {
 9     class one extends Thread{
10         @Override
11         public void run() {
12             System.err.println("1:获取连接");
13             Connection con = 
14                     ProxyConnUtils.getConnection();
15             try{
16                 System.err.println("2:打开事务");
17                 con.setAutoCommit(false);
18                 System.err.println("3:写入Jack");
19                 Statement st = con.createStatement();
20                 st.execute("insert into money(id,name) values(1,\'Jack\')");
21                 System.err.println("4:提交  ..");
22                 con.commit();
23             }catch(Exception e){
24                 e.printStackTrace();
25             }finally {
26                 try {
27                     System.err.println("5:关闭连接");
28                     con.setAutoCommit(true);
29                     con.close();
30                 } catch (Exception e) {
31                     e.printStackTrace();
32                 }
33             }
34         };
35     };
36     
37     public Demo01_tx3() {
38         for(int i=0;i<5;i++){
39             new one().start();
40         }
41     }
42 
43     public static void main(String[] args) {
44         new Demo01_tx3();
45     }
46 }

运行结果

以上是关于使用代理创建连接池 proxyPool的主要内容,如果未能解决你的问题,请参考以下文章

使用redis+flask维护动态代理池

4.使用Redis+Flask维护动态代理池

爬虫代理池源代码测试-Python3WebSpider

用golang 实现一个代理池

centos7生产环境IP代理池(python)

设计模式代理模式实现连接池