就用try包括,等异常时查看错误信息不就可以了吗

解决方案 »

  1.   

    如果正常连接数据库的话,conn.isClosed()不会不起作用啊
      

  2.   

    用try出来的是
    your session hase been killed
      

  3.   

    杀了连接的进程,connection应该是非法关闭,当然后面的操作会出错
    你如果try到了这个异常,然后在catch里面response.sendRedirect("/error.htm");return;而不通过conn==null来判断,这样不也达到了同一效果了吗
      

  4.   

    首先你想想一个连接是从连接池中获得的,你要判断他的状态当然是去该连接池的管理处查询。
    其次连接在数据库端被kill,则这个连接对象就已经失效了,你又怎么能通过自身的属性方法去判断呢,这好比让一个死人去对别人说他是死的还是活的。
      

  5.   

    我的连接池是通过conn.isClosed()来判断的,可是我发现碰到这种情况,
    它不生效呀
      

  6.   

    kill掉连接,估计连接池破坏,conn.isClosed()就会抛出异常,不生效的原因之一
      

  7.   

    try
    {
    if(conn.isClosed())
    {

    log("delete a connection from pool");
    conn = getConnection();
    }
    }
    catch(SQLException sqlException)
    {
    conn = getConnection();
    log("error in delete a connection from pool",sqlException);
    }
    上面的代码应该没问题吧,
    它怎么不递归,还是返回一个错误的conn
      

  8.   

    什么叫不递归?这个哪用到递归了,按道理在catch里重建了连接,然后打出一条日志,后面的程序应该继续执行,你说返回错误,是在哪返回,是在后面用conn的时候吗?不明白你什么意思
      

  9.   

    对了,还有你在try里没有执行SQL的操作,但你的catch捕获的是SQLException,这肯定抓不到的。改成Exception应该可以,再试试
      

  10.   

    public synchronized Connection getConnection()
    {
    Connection conn = null;
    if(freeConn.size() > 0)
    {
    conn = (Connection)freeConn.firstElement();
    freeConn.removeElementAt(0);
    try
    {
    if(conn.isClosed())
    {

    log("delete a connection from pool");
    conn = getConnection();
    }
    }
    catch(SQLException sqlException)
    {
    log("error in delete a connection from pool",sqlException);
    conn = getConnection();
    }
    }
    else if(client < maxConn)
    {
    conn = this.newConnection();
    }
    if(conn != null)
    {
    client++;
    }

    //log(freeConn.size()+"    "+client+"   "+maxConn);
    return conn;
    }这里不是递归吗?conn.isClosed()抛出的是SQLException.
    API中 boolean isClosed() throws SQLException;
    就是这样的呀.
      

  11.   

    哦,这样,程序看起来好象没问题,API中说if a database access error occurs,就会抛出SQLException,我想会不会是conn = (Connection)freeConn.firstElement();这个有问题,freeConn.......思考中
      

  12.   

    前面有freeConn.addElement(conn);
    后面才,conn = (Connection)freeConn.firstElement();
    可有时候取出来的conn是无效的,不好判断呀
      

  13.   

    有一个办法就取出连接后试着从dual表中执行一条SQL(select * from dual)
    然后捕捉异常来判断,这样的话我用连接池了来提高速度的算盘也就落空了
      

  14.   

    实际运用中好似conn.isClosed()真的不起作用的,只要你没有用conn.close(),conn.isClosed()总会为false.
    一个方法是另写一个
    public boolean isClosed(){
      try{
        Statement stmt=conn.createStatement();
        stmt.close();
        return false;
      }catch(Exception e){
        return true;
      }
    }
    请各位指教.