2012-06-07 77 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方法通常擺脫這個問題。

相關問題