上网找了一堆资料,恕本人比较愚钝,看不懂也不愿看那些blog,想周末去买一本写的明白的书,高手们能否推荐一下?感激不尽。

解决方案 »

  1.   

    介绍一个网页:
    http://java.sun.com/developer/onlineTraining/Programming/JDCBook/conpool.html再介绍一个:
    http://java-source.net/open-source/connection-pools最后介绍一本书:
    http://pdf.coreservlets.com/CSAJSP-Chapter18.pdf
      

  2.   

    好像没有这种书,哪会用一本书来介绍连接池的,根本不可能的,
    夏昕的《深入浅出Hibernate》中对连接池有相当的介绍,找个
    电子版的看看就可以了。连接池要考虑的东西很多,要实现的话没有那么简单的。里面涉及
    很多的东西。连接池的原理基本上就是使用一个集合作为池,里面存放了多个打开的Connection,
    调用某个方法时取出一个,若里面没有了,再有请求来的话,若已经取出的连接正好是
    池的最大数(可设置的),那就等,等了一段时间还是没有话就抛出异常(或者是继续等)。
    当用户调用con.close()时,并不是真正地关闭了连接,而是采用动态代理技术重写了close()
    方法,将其还回池中去。开源的框架有C3P0、DBCP都是相当不错的。写了一个不能称为池的东西,始终只有一个连接,供单机测试用,如果再使用一个集合作为池的话,
    再考虑一些并发操作,就基本上可以实现一个简陋的了。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.sql.SQLException;import com.util.DatabaseUtil;public class ConnectionFactory { private static Connection con = null; private ConnectionFactory() {
    } /**
     * 采用单例模式的连接工厂
     * 
     * @return
     * @throws SQLException
     */
    public synchronized static Connection getConnection() throws SQLException {
    if (con == null || con.isClosed()) {
    try {
    Class.forName(DatabaseUtil.getDriver());
    String url = DatabaseUtil.getUrl();
    String username = DatabaseUtil.getUsername();
    String password = DatabaseUtil.getPassword();
    con = DriverManager.getConnection(url, username, password);
    ConnectionHandler conHandler = new ConnectionHandler();
    con = conHandler.bind(con);
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }
    return con;
    }
    }/**
     * 利用动态代理,在调用 close() 时并不真正的关闭 Connection,
     * 便于重用,在单机用户中始终只存在一个 Connection,提高连接速度
     * @author Administrator
     */
    class ConnectionHandler implements InvocationHandler {
    private Connection con = null;
    public Connection bind(Connection connection) {
    con = connection;
    Connection conProxy = (Connection)Proxy.newProxyInstance(
    connection.getClass().getClassLoader(),
    connection.getClass().getInterfaces(),
    this
    );
    return conProxy;
    }

    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    Object obj = null;
    if(!method.getName().equals("close")) {
    obj = method.invoke(con, args);
    }
    return obj;
    }
    }