当我把ConnectionPool.java中第55行的poolSize改成5,就不报错了,可是为什么会这样呢,定义的poolSize是10。

解决方案 »

  1.   

    你在关闭的地方打印一下pool的size。肯定是超出这个size了,报了越界异常
      

  2.   

    嗯,poolSize是10,可是为什么会越界呢,我定义的就是10个啊!
      

  3.   

    嗯,poolSize是10,可是为什么会越界呢,我定义的就是10个啊!
    把poolSize改成20后,10就不越界了,看来是取得中间值?
      

  4.   

    这个好像有点问题:public synchronized void closePool() {
            for (int i = 0; i < poolSize; i++) {
                try {
                    ((Connection)pool.get(i)).close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                pool.remove(i);
            }
        }
    你是获得一个连接,pool中remove掉,release掉,再添加到pool中,这个关系是对应的。但是你关闭了又把conn从vector中remove了。这个pool理论上是越来越少。把pool.remove(i);去掉试试
      

  5.   

    去掉了,确实没有报错了。可是我是把关闭的那个conn 给 remove掉啊,目的就是去掉pool中所有的conn。
      

  6.   

    去掉了,确实没有报错了。可是我是把关闭的那个conn 给 remove掉啊,目的就是去掉pool中所有的conn。你调用了release就已经remove了啊。你再调用pool.remove就是remove两遍了。你看下你的release方法
      

  7.   

    你把你5行代码 for (int i = 0; i < poolSize; i++) { poolsize改为pool.size()
    指针越界你看见没有你先定义个一个容器为pool = new Vector<Connection>(poolSize); 这个是为10的
     然后在读取你的配置文件这个时候你定义了5 循环的时候5后面的连接数为空就不能关闭了 肯定报错了。
    要么就先 pool = new Vector<Connection>(poolSize);  readConfig(); // 读取配置文件 这2个地方换下位子先读取配置文件在定义容易数量大小。还有你的循环都没有加为空判断了。个人感觉不怎么好。
      

  8.   

    而且你每次这么调用 pool = ConnectionPool.getInstance(); 你的链接数都不会减少。
      

  9.   

       /**
         * 关闭连接池中的所有数据库连接
         */
        public synchronized void closePool() {
            for (int i = 0; i < poolSize; i++) {
                try {
                    ((Connection)pool.get(i)).close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                pool.remove(i);
            }
        }
    如果你想去掉pool里面所有的conn可以用pool.clear();
       /**
         * 关闭连接池中的所有数据库连接
         */
        public synchronized void closePool() {
            for (int i = 0; i < poolSize; i++) {
                try {
                    ((Connection)pool.get(i)).close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
              
            }
      pool.clear();//从此向量中移除所有元素。
        }
    刚才的指针越界确实是楼上大哥说的那样remove之后容易大小减少获取了一个空值就错了。最好加上为空判断
      

  10.   

    改成这样之后public synchronized void closePool() {
    for (int i = 0; i < poolSize; i++) {
    if(pool.get(i) != null){
    try {
    ((Connection)pool.get(i)).close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    System.out.println("============="+pool.size());
    // pool.remove(i);
    }
    }
    System.out.println("============="+pool.size());
    pool.clear(); //从此向量中移除所有元素。
    System.out.println("============="+pool.size());
    }
    循环里面的==========10也是只打印了五次,说明不remove,pool里面的非空conn也只有5个,release方法是add(conn),在那里加输入pool.size输出了10次。我还是不明白连接池里面为什么只有5个连接
      

  11.   

    去掉了,确实没有报错了。可是我是把关闭的那个conn 给 remove掉啊,目的就是去掉pool中所有的conn。你调用了release就已经remove了啊。你再调用pool.remove就是remove两遍了。你看下你的release方法我没用remove了,还是只有一半的连接。release方法是add(conn),这是为什么
      

  12.   


    看我的第一个回复内容
    首先你看下你的配置连接数的配置文件配置的是多少你定义的容器数量是10也就是pool.size();
    而后来的poolSize是取你配置文件的数量也就是你解析后的长度了。
      

  13.   

    去掉了,确实没有报错了。可是我是把关闭的那个conn 给 remove掉啊,目的就是去掉pool中所有的conn。你调用了release就已经remove了啊。你再调用pool.remove就是remove两遍了。你看下你的release方法我没用remove了,还是只有一半的连接。release方法是add(conn),这是为什么
    我觉得你代码哪有写没有问题 我不清楚你配置文件配置的是多少?