2012-06-07 78 views
6

好的一直试图在过去的2天内找出这个问题。ResultSet关闭后不允许执行操作

Statement statement = con.createStatement(); 
         String query = "SELECT * FROM sell"; 
         ResultSet rs = query(query); 
         while (rs.next()){//<--- I get there operation error here 

这是查询方法。

public static ResultSet query(String s) throws SQLException { 
     try { 
      if (s.toLowerCase().startsWith("select")) { 
       if(stm == null) { 
        createConnection(); 
       } 
       ResultSet rs = stm.executeQuery(s); 
       return rs; 
      } else { 
       if(stm == null) { 
        createConnection(); 
       } 
       stm.executeUpdate(s); 
      } 
      return null; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      con = null; 
      stm = null; 
     } 
     return null; 
    } 

我该如何解决这个错误?

+3

应用程序中是否有其他线程? – NPE

+0

如果您发布了您正在获取的实际错误,那将会非常有用。没有描述发生的事情,人们不能真正帮助解决问题。我也从来没有看到你正在创建连接或语句的“查询”方法的位置。我看到对createConnection()的调用,但没有赋值,并且在该方法内没有赋值“stm”。 – Matt

回答

5

很难确保刚刚从您发布的代码,但我怀疑ResultSet无意中得到关闭(或stm是越来越重复使用)while的体内。这会在下面的迭代开始时触发异常。

此外,您需要确保应用程序中没有其他线程可能使用相同的数据库连接或stm对象。

+0

它值得。代码脏写,写入不必要的复杂。 – Sajmon

3

恕我直言,你应该在你关闭连接之前,用你的ResultSet做你需要的一切。

2

有几件事情需要解决。打开一个连接,运行一个查询来获取rs,关闭它并关闭连接应尽可能在同一个函数范围内完成。从你的代码中,你似乎使用“con”变量作为全局变量,这可能会导致问题。你没有关闭stm对象。或rs对象。此代码不会运行太久,即使它没有错误。您的代码应该是这样的:

if (stringUtils.isBlank(sql)){ 
    throw new IllegalArgumentsException ("SQL statement is required"); 
} 
Connection con = null; 
PreparedStatement ps =null; 
Resultset rs = null; 
try{ 
     con = getConnection(); 
     ps = con.preparestatement(sql); 
     rs = ps.executeQuery(); 
     processResults(rs); 
     close(rs); 
     close(ps); 
     close(con); 
}catch (Execption e){ 
     log.Exception ("Error in: {}", sql, e); 
     throw new RuntimeException (e); 
}finally{ 
     close(rs); 
     close(ps); 
     close(con); 
} 
2

使用另一个Statement对象在内环 像

Statement st,st1; 

st=con.createStatement(); 
st1=con.createStatement(); 

//in Inner loop 
while(<<your code>>) 
{ 
    st1.executeQuery(<<your query>>); 
} 
1

我知道这是一个几年晚,但我发现,同步DB方法通常摆脱这个问题。

相关问题