ResultSet temprs=sqlBeanId.executeQuery(sql);
 while(temprs.next())
    { String unitID=temprs.getString("unit_ID");
      String tempsql="insert into TempUnit(unit_ID) values ('"+unitID+"')";
      sqlBeanId.executeInsert(tempsql);
      stmt.close();
      conn.close();
    }
 temprs.close();
 stmt.close();
 conn.close();内嵌式的对数据库操作时,stmt和conn应什么时候、如何关闭?
我这样写有问题吗?是否会导致资源泄漏?
bean里面有类:
 //数据查询、更新
  public ResultSet executeQuery(String sql){
    rs=null;
    try{conn=DriverManager.getConnection(SDBUrl,User,PW);
        stmt=conn.createStatement();
        rs=stmt.executeQuery(sql);    }
    catch(SQLException ex){ System.err.println("ExectueQuery():"+ex.getMessage());  }
    return rs;
  }
  //数据插入
  public void executeInsert(String sql){
    try{conn=DriverManager.getConnection(SDBUrl,User,PW);
        stmt=conn.createStatement();
        stmt.executeUpdate(sql);    }
    catch(SQLException ex){ System.err.println("ExectueUpdate():"+ex.getMessage()); }
  }

解决方案 »

  1.   

    数据库连接可以在你 不用时在关闭
    而stm 则可以不用关闭 
    resultset 则是用完一次 就关闭 
      

  2.   

    我认为你这样会不会浪费呢?
    你的查询方法就创建了一个conn,这个对象一直存在
    然后又是循环插入 每次又创建了一个conn 这样是不是浪费呢?为什么不从另外一个方法获得连接conn 然后把这参数传入查询和插入方法
    这样就是仅仅操作一个conn 之后循环结束后,关闭conn至于Statement java文档好像是说自动关闭,不过好像是存在争议
      

  3.   

    循环里调用了
          stmt.close();
          conn.close();
    会出问题的....关闭已经关闭的资源会出错的.
    把这两句去掉.
      

  4.   

    你的这种封装的思想是很好的,想做一个通用的数据库操作类,以后每次进行数据操作的时候只传一个sql语句字符串,调用相应的方法就可以进行查询,添加等等了。我认为应该改为:
    ResultSet temprs=sqlBeanId.executeQuery(sql);
     while(temprs.next())
        { String unitID=temprs.getString("unit_ID");
          String tempsql="insert into TempUnit(unit_ID) values ('"+unitID+"')";
          sqlBeanId.executeInsert(tempsql);
          }
     if(temprs!=null)temprs.close();
     if(stmt!=null)stmt.close();
     conn.close();
    加判断,避免空指针的出现。