本帖最后由 22cgreen 于 2009-06-20 14:31:52 编辑

解决方案 »

  1.   

    楼主是想模拟数据库连接池把??
    出现这个异常时因为freeCon.getFirst();值为空
    肯定是楼主释放掉资源没有把资源放入连接池中,刚开始启动的时候比如有20个连接吧,
    用过释放掉,你用过20个之后,连接池中的connection就空了,所有报了这个异常.楼主释放资源的代码有问题.自己看看,是不是没把connection放回连接池中
      

  2.   

    你释放时没把Conn放回连接池吧?
      

  3.   

    private LinkedList<Connection> freeCon = Collections.synchronizedList(new LinkedList<Connection>());----------------------------------------------------------------------------------------------------
      

  4.   

    public Connection getConn()
    方法没有同步,导致两个线程同时进入此方法了结果线程一在运行re = freeCon.getFirst();之后,可能时间片用完了,暂时停止运行。
    这个时候线程二进入了这个方法,同时运行了removeFirst了。
    然后线程一继续运行时removeFirst就报错了所以你的getConn必须增加同步声明
      

  5.   

    LinkedList存在结构变化,多线程访问时需要加同步。
      

  6.   

    removeFirst(){synchronized (freeCon) {
    freeCon.remove(0);
    }
    }
      

  7.   

    我觉得是需要同步的,因为你的连接list是一个共享资源
      

  8.   

    我觉得是同步问题也不像,就算其中有一次发生多线程访问,其中一次发生这个现象正常,但是我第二次,第三次请求时那前面linkedList中都没有元素了,按理第二次,第三次请求就不freeCon.size()=0了,更不可能还能执行re = freeCon.getFirst();,可事实上不管那次请求出错的都是 freeCon.removeFirst();这是为什么呢?每次执行freeCon.size()都大于0,为什么后面又没有元素呢?我估计很有可能是tomcat或者java本身的问题
      

  9.   

    感觉还是6楼说的线程同步问题,至于后面也发生这个情况可能是你在什么地方又向freeCon里添加了Connection结果导致发生同样的情况。
      

  10.   

     re = freeCon.getFirst();
    if(re!=null){
      freeCon.removeFirst();  
    }          试试
      

  11.   

    你这个异常我用List的时候也出现过,不知道情形是否相同
    解决方法是
    不要用你list对象直接去remove
    而是用Iterator遍历
    然后用Iterator对象去removefor (Iterator it = list.iterator(); it.hasNext();) {
        Object o=it.next();
        if(条件){
             it.remove();
        }
    }说不出原因来,但的确能解决
      

  12.   

    linkedList是可以存在null元素,而且可以存在多个,
    因此if(re!=null){ 
      freeCon.removeFirst();  
    }   
    我觉得没意思,再说我这个错误可能10天都不会花生。
    一旦发生就必须要重启,不然怎样都不能使用。
      

  13.   

    1,首先这个类必须是单例.不能存在两个连接池控制对象.
    2,其次,这个getConnection方法必须是同步的.否则会造成同抢而抛异常.
    3,满足了2,ArrayList是否要同步就无所谓了.应为不会同抢了.
      

  14.   

    我有一点不明白,这里的错误并非数据库连接的错误,是linkedList的错误,是removeFirst()这个方法的错误,
    我不明白为什么扯到连接池,或者连接上去,错误并非连接不到,或者连接数据库出错.错误显示的行数和显示的错误方法
    跟数据库连接没有任何关系,就出现在我连代码的.removeFirst(),你们的意思说报出的错误有假?
      

  15.   

    没试试我说的方法?
    要不去网上查查list的remove是如何操作的
    我感觉是迭代器的问题
      

  16.   

    此问题有了进一步的结果了,在记录的日志中发现,freeCon.size()为4,但freeCon没有一个元素了,发生了freeCon size和元素不对应的关系.System.out.println("freeCon size:"+freeCon.size());
    for(int i=0;i<freeCon.size();i++)
    {
    if(freeCon.get(i)==null)
    {
    System.out.println("freeCon.get("+i+")is Null");
    }else{
    System.out.println("Item is:"+freeCon.get(i).toString());
    }
    }很大可能是多线程引起freeCon中元素被清除了,但实际的size的数字却还没变,出现了size和实际元素个数不同步的现象,不过看java原码size可知,它也是一个
    属性,只是remove时 size--;并非每次去计算元素的个数,如此多线程使得LinkedList中乱套也是很有可能的.我在getConn方法上加了synchronized,如果没问题出现,那绝对就是多线程引起的,不过如此可以看出多线程是乎引起的错误有时真难以理解,从表面看它是否都是乎不合乎逻辑.不过有一点说明,上面有些兄弟说的是的多线程同时调removefirst()引起,但很难解释为什么第二次,第三次请求时一样有错,真正的原因,应是多线程调用时使linkedList中的size和实际元素个数不同步的原因.
      

  17.   


                 if(re.isClosed())
                    {
                        this.getConn();
                    }
    过几天发生一次是因为才开始的时连接池里面链接都是正常的 没有被关闭,过几天后可能由于某些原因链接被断掉了 
    可以检查一下 我说的这个 测试很简单 你先写个程序把所有的链接都close掉再压力测一下
      

  18.   

    LinkedList不是线程安全的。你可以改成用Vector或者SynchronizedList。
      

  19.   

    楼主你好!我看你这里的目的就是把链接暂时存放于list中达到一定时刻链接的一致性!完全可以使用Thead<Connection> thread=new Thread<Connection>();这样就可以保持线程安全又可以达到一定连接池效果!
      

  20.   

    改成 private List<Connection> freeCon = new LinkedList<Connection>(); 试试
      

  21.   

    哥哥,你的linklist是空的,调用removeFirst 当然报错。remove之前先判断下它的size啊
      

  22.   

    各位兄弟的回答是否没有看我的回复,或是没有看我的问题,同步可能是这问题的真正原因,对于其它的什么数据库连接的问题就不要再说了,我前面的测试结果充分表面了,linkedList在出问题时size和实际元素的真正个数不一样,前面有人说在remove前判断size,我前面代码本来就判断了啊,不过此问题怎么因为多线程引起size和实际元素不同步还说不好其中原理。
      

  23.   

    removeFirst
    public E removeFirst()移除并返回此列表的第一个元素。 指定者:
    接口 Deque<E> 中的 removeFirst
    返回:
    此列表的第一个元素 
    抛出: 
    NoSuchElementException - 如果此列表为空
    这是api上面的说法.跟你报的错误一样.所有得出结论你的list里面根本没有数据
      

  24.   

    关于SSH开发的代码生成器,再摘抄转发给大家共享,有图有真相,标题一定要长 以下是原图转载,有图有真像,希望对大家学习SSH开发有帮助。
    需要AutoCode代码生成器SSH版的朋友,可以到天空软件园www.skycn.com
    输入autocode来下载最新SSH版来使用。