首页 > 代码库 > 动态代理连接数据库

动态代理连接数据库

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 + "\t" + this.getName() + "\t"
                                + st);

                    } catch (SQLException e) {
                        e.printStackTrace();

                    } finally {
                        try {
                            con.close();
                        } catch (SQLException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    }
                };

            }.start();

        }

    }
}