为什么第二次执行rs = stmt.executeQuery(sql);时会没反应?

时间:2022-12-01 20:29:12
代码如下:
import java.sql.*;


public class DbConnect{

private static final String sConnStr = "jdbc:odbc:cafd2004";
    private static final String sDBDriver= "sun.jdbc.odbc.JdbcOdbcDriver"; 
private  Connection con  = null;
private  ResultSet  rs   = null;
private  Statement  stmt = null; 
private  PreparedStatement  prestmt = null; 

    public DbConnect(){
      try{
       Class.forName(sDBDriver);
      }catch(ClassNotFoundException e){
       System.err.println(e.getMessage());
      }
    }
   //执行SQL语句 
   public ResultSet executeSQL(String sql){
     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());
     }
     return rs;
   }
}

我多次调用函数executeSQL(String sql),但第二次调用时,执行到rs = stmt.executeQuery(sql);就执行不下去了,也不说出错,请问这是什么原因?

18 个解决方案

#1


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();
   }

#2


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

#3


同意二楼的。

要关闭


#4


是的,每次用完数据库资源都应该及时关闭!

#5


rs = null;



rs.close(); 
是2码事。

就好像一个东西弄丢了和他在这个世界消失了有所不同。

#6


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

#7


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

#8


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

#9


还有stmt也要关闭吗?

#10


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

#11


ResultSet  rs1;
ResultSet  rs2;

rs1 = stmt.executeQuery(sql);
rs2=rs1

其中rs2需不需要close?不过close好像也不会出错吧??

#12


!!!!

#13


rs2=rs1;
这两个就变成同一个东东啦,所以rs1如果close,等同于rs2也close了。
stmt这个东东是使用tcpip连接访问数据库的,同一个连接是不能支持两个打开的对话(就如同你不能用一个电话同时和两个人说话一样),所以你一定要先挂掉一个电话,再拨一次号

#14


一个Statement只能对应一个查询

一个Statement可以对应多个插入、删除、更新操作

每个查询使用完毕后 Statement对象必须关闭 ResultSet对象最好关闭

#15


你使用的查询方式是
ResultSet.CONCUR_UPDATABLE

这种查询会在记录级或表级上加锁,相当于

select * from user for update

又一个线程也想
select * from user for update
数据库就不干了,所以就会停在这里,只有等第一个线程执行完后
或commit结束了它的事物,第二个线程才能继续执行下去

#16


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

#17


学习

#18


对的锁住了

#1


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();
   }

#2


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

#3


同意二楼的。

要关闭


#4


是的,每次用完数据库资源都应该及时关闭!

#5


rs = null;



rs.close(); 
是2码事。

就好像一个东西弄丢了和他在这个世界消失了有所不同。

#6


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

#7


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

#8


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

#9


还有stmt也要关闭吗?

#10


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

#11


ResultSet  rs1;
ResultSet  rs2;

rs1 = stmt.executeQuery(sql);
rs2=rs1

其中rs2需不需要close?不过close好像也不会出错吧??

#12


!!!!

#13


rs2=rs1;
这两个就变成同一个东东啦,所以rs1如果close,等同于rs2也close了。
stmt这个东东是使用tcpip连接访问数据库的,同一个连接是不能支持两个打开的对话(就如同你不能用一个电话同时和两个人说话一样),所以你一定要先挂掉一个电话,再拨一次号

#14


一个Statement只能对应一个查询

一个Statement可以对应多个插入、删除、更新操作

每个查询使用完毕后 Statement对象必须关闭 ResultSet对象最好关闭

#15


你使用的查询方式是
ResultSet.CONCUR_UPDATABLE

这种查询会在记录级或表级上加锁,相当于

select * from user for update

又一个线程也想
select * from user for update
数据库就不干了,所以就会停在这里,只有等第一个线程执行完后
或commit结束了它的事物,第二个线程才能继续执行下去

#16


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

#17


学习

#18


对的锁住了