说说我的看法:
1、makePool()方法应该做成一个静态初始化。至少也应该是一个单实例。我感觉完全没必要实例化。
2、getConn()、returnConn()方法应该是synchronized方法

解决方案 »

  1.   

    getConn()、returnConn()可以做成static的,这样就不用ConnectPool.getInstance()这样来调用了。
      

  2.   

    我对自己这段程序的进一步理解其实这样写主要就是靠static来实现连接的重用。我写这段程序是这样开始的:    创建一个连接  -> 执行sql语句(计算时间)    结果:每秒钟可以插入200条记录(1个用户)  写这个类,起先在getConn()、returnConn()也都是synchronized的方法,可是  结果:每秒钟插入数据库记录2条(1个用户)  所以我只好去掉synchronized,  结果:每秒钟插入数据库记录5条(1个用户)  天那,我的程序究竟慢在那里啊?也不应该差几十倍啊  经过继续测,其实前面打印出来的对象地址,这种情况是对的,因为用完一个conn后,再  将它返回到 collection,它已经被置入collection的尾部,所以打印出来的结果不同。  可是,速度为什么还是这么慢呢,为什么????  pool中显示总是还有多个空闲连接,可是操作速度又上不去。  唉,我先去哭吧
      

  3.   

    我认为问题主要在
        public static ConnectPool getInstance(){
            try{
                ConnectPool cp = new ConnectPool(); 〈==============这根本不是单例模式啊
                if(freeConnections.size() == 0){
                    makePool();
                }            return cp;
            }
            catch(Exception e){
                e.printStackTrace();
                return null;
            }
        }
    每次都try{}catch(){} new一个,不慢也难。
      

  4.   

    其实我是建议把getConn和returnConn做成静态方法的,不过你要这么用,就先按你的办法吧。
    import java.util.*;
    import java.sql.Connection;
    public class ConnectPool {
        private static ConnectPool cp = new ConnectPool();
        private Collection freeConnections = new ArrayList();
        private Collection usedConnections = new ArrayList();
        private int connectionNum = 5;
        private int poolID = 0;
        private ConnectPool()
    {
        }
        public synchronized Connection getConn() throws Exception {
            if (cp.getFreeConnections().size() == 0)
            {
                cp.makePool();
            }
            Iterator it = cp.getFreeConnections().iterator();
            if (it.hasNext())
            {
                Connection conn = (Connection) it.next();
                cp.getFreeConnections().remove(conn);
                cp.getUsedConnections().add(conn);
                return conn;
            }
            else
            {
                throw new Exception("error: not available connection from pool.");
            }
        }
        private java.util.Collection getFreeConnections()
    {
            return freeConnections;
        }
        public static ConnectPool getInstance()
    {
            if (cp == null)
                cp = new ConnectPool();        return cp;
        }
        private java.util.Collection getUsedConnections()
    {
            return usedConnections;
        }
        private void makePool()
    {
            if (getFreeConnections().size() != 0)
                return;
            for (int i = 1; i <= connectionNum; i++)
            {
                Connection conn = DBUtil.getDBConnections(DatabaseNames.PROP_FILENAME);
                freeConnections.add(conn);
            }
        }
        public synchronized void returnConn(Connection conn)
    {
            cp.getUsedConnections().remove(conn);
            cp.getFreeConnections().add(conn);
        }
    }