rs没有关闭,可能导致数据表被锁住,第二次访问要等待第一次的访问释放资源。 try{
      con  = DriverManager.getConnection(sConnStr);
      stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 
      rs = stmt.executeQuery(sql);
   }catch(SQLException error){
      System.err.println("执行executeSQL出错:"+error.getMessage());
   }finally{
      rs.close();
   }

解决方案 »

  1.   

    可我在执行前加了条语句rs =null;也不行啊
    而且我把ResultSet  rs   = null;声明成函数内部的局部变量也不行,就是在public ResultSet executeSQL(String sql){ 的下面声明
      

  2.   

    rs = null;和rs.close(); 
    是2码事。就好像一个东西弄丢了和他在这个世界消失了有所不同。
      

  3.   

    编程习惯不好,RS&CONN一定要关的,不然连接到了一定的个数后就再也连不上了
      

  4.   

    rs = null;
    这个结果集要等jvm垃圾回收的时候才会被关闭,但是你不知道jvm什么时候进行垃圾回收。
      

  5.   

    final{
    rs.close();  //关闭结果集连接
    rs=null;     //结果集置空
    con.close(); //关闭数据库连接
    }
      

  6.   

    我在一些地方看到说,使用同一个stmt,打开第二个rs的时候,它会自动把第一个打开的rs关闭,这样的话怎么还需要手动关闭?
    谢谢
      

  7.   

    ResultSet  rs1;
    ResultSet  rs2;rs1 = stmt.executeQuery(sql);
    rs2=rs1其中rs2需不需要close?不过close好像也不会出错吧??
      

  8.   

    一个Statement只能对应一个查询一个Statement可以对应多个插入、删除、更新操作每个查询使用完毕后 Statement对象必须关闭 ResultSet对象最好关闭
      

  9.   

    你使用的查询方式是
    ResultSet.CONCUR_UPDATABLE这种查询会在记录级或表级上加锁,相当于select * from user for update又一个线程也想
    select * from user for update
    数据库就不干了,所以就会停在这里,只有等第一个线程执行完后
    或commit结束了它的事物,第二个线程才能继续执行下去
      

  10.   

    哦,怪不得我一次用ResultSet.CONCUR_READONLY没事,改用ResultSet.CONCUR_UPDATABLE就不执行了,原来如此,谢谢!!