zoukankan      html  css  js  c++  java
  • 动态代理连接数据库

    package 动态连接数据库;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.util.LinkedList;
    
    public class UtilsDB {
    
        public static void main(String[] args) {
            UtilsDB u = new UtilsDB();
            System.err.println(u.getCon());
    
        }
    
        private static LinkedList<Connection> pool = new LinkedList<Connection>();
    
        static {
            try {
    
                Class.forName("com.mysql.jdbc.Driver");
                String url = "jdbc:mysql:///abc";
    
                for (int i = 0; i < 3; i++) {
                    // 真实对象
                    final Connection con = DriverManager.getConnection(url, "root",
                            "1234");
                    // 声明代理
    
                    Object obj = Proxy.newProxyInstance(
                            UtilsDB.class.getClassLoader(),
                            new Class[] { Connection.class },
    
                            new InvocationHandler() {
    
                                @Override
                                public Object invoke(Object proxy, Method method,
                                        Object[] args) throws Throwable {
    
                                    if (method.getName().equals("close")) {
    
                                        System.err.println("有人还连接");
    
                                        synchronized (pool) {
                                            pool.addLast((Connection) proxy);
                                            pool.notifyAll();
                                            return null;
    
                                        }
    
                                    } else {
                                        return method.invoke(con, args);
    
                                    }
    
                                }
                            });
    
                    // 将代理人添加到pool
    
                    pool.add((Connection) obj);
    
                }
    
            } catch (Exception e) {
    
                throw new RuntimeException(e);
    
            }
    
        }
    
        public static Connection getCon() {
            synchronized (pool) {
                if (pool.size() == 0) {
                    try {
                        pool.wait();
    
                    } catch (Exception e) {
    
                        throw new RuntimeException(e.getMessage());
                    }
                    return getCon();
                } else {
    
                    Connection con = pool.removeFirst();
                    System.err.println("pool.size:" + pool.size());
                    return con;
    
                }
    
            }
    
        }
    
    }
    package 动态连接数据库;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class TestDb {
    
        public static void main(String[] args) {
            //Connection con=UtilsDB.getCon();
            //System.err.println(con);
            
            
                for (int i = 0; i < 110; i++) {
    
                new Thread() {
                    public void run() {
    
                        Connection con = UtilsDB.getCon();
    
                        try {
                            Statement st = con.createStatement();
    
                            System.err.println(con + "	" + this.getName() + "	"
                                    + st);
    
                        } catch (SQLException e) {
                            e.printStackTrace();
    
                        } finally {
                            try {
                                con.close();
                            } catch (SQLException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
    
                        }
                    };
    
                }.start();
    
            }
    
        }
    }
  • 相关阅读:
    学习淘宝指数有感
    STL学习小结
    Java里泛型有什么作用
    android 内存泄漏分析技巧
    学道1.3
    严苛模式(StrictMode)
    年龄大了还能够学习编程吗
    ORACLE EXP命令
    数学之路-python计算实战(13)-机器视觉-图像增强
    《C语言编写 学生成绩管理系统》
  • 原文地址:https://www.cnblogs.com/xiaweifeng/p/3703308.html
Copyright © 2011-2022 走看看