2015-12-17 135 views
0

我在構建一個3-tier應用程序,該應用程序使用java類從用戶界面的dbjsp頁中檢索數據。當我嘗試調用返回結果集JSP頁面的方法,我得到這個錯誤信息:調用返回結果集的方法

不允許操作的ResultSet關閉後。

例如,我有這樣的方法:

public ResultSet getName(String country) throws SQLException { 
    String name; 
    try { 
     open(); 
     stmt1 = con.prepareStatement(fetchPanepistimio); 
     stmt1.setString(1,country); 
     rs1 = stmt1.executeQuery(); 
     stmt1.close(); 
     close(); 
    }catch(Exception e2) { 
    } 

    return rs1; 

} 

,當我在JSP頁面中寫:

<% 

ResultSet rs = panepistimio.getName(country); 

while(rs.next()) { %> 

........... 
<% } %> 

我得到我所描述的異常。你有什麼想法是錯誤的?預先感謝您

+1

你確切想要返回什麼結果集或查詢結果? –

+0

數據庫的內容。在這種情況下,我需要數據庫上的大學的名稱 – nikiforosb

+0

然後,您首先從ResultSet獲取內容,然後使用String返回它,但是關閉ResultSet然後返回,它絕對不起作用。 –

回答

1

在您的示例中,當您致電stmt1.close()時,ResultSet已關閉。在單一方法中執行數據庫訪問,將結果添加到適當的Collection並返回。

例如:

public Collection<String> getName(String country) { 
    String sql = "..."; 
    Collection<String> names = new ArrayList<>(); 
    try(Statement statement = ...; ResultSet resultSet = statement.executeQuery(sql)){ 
     while(resultSet.next()) { 
      names.add(resultSet.getString(...)); 
     } 
    } catch (SQLException e) { 
     // LOG 
    } 
    return names; 
} 
2

您試圖關閉數據庫連接stmt1.close();close();),它不工作的方式之後要訪問的ResultSet。 (更多解釋請參見Oracle's tutorial)。

而不是斷開連接,您應該檢索ResultSet的內容,然後在JSP頁面中使用它。 這樣,就可以將DB查詢的生命週期從視圖生命週期中分離出來。

0

你打電話關閉聲明,你不應該這樣做。

其次,你不應該忍受如catch(Exception e2) {}的豁免。 這使得追蹤錯誤變得困難或不可能。

第三,在JSP中迭代ResultSet不是好習慣。這應該在後端完成,例如, (在getName)。請參閱How to avoid Java code in JSP files?

1

這是因爲您正在關閉PreparedStatement對象,該對象在執行查詢(並且可能還會關閉Connection)後立即創建了ResultSet

從爲Statement#close()方法的文檔(PreparedStatementStatement孩子):

釋放此Statement對象的數據庫和JDBC資源,而不是等待時,自動關閉這種情況發生。一旦您完成了資源釋放資源以避免捆綁數據庫資源,通常是一種很好的做法。

在已經關閉的Statement對象上調用close方法沒有效果。

注意:當Statement對象關閉時,其當前ResultSet對象(如果存在)也將關閉。

強調我的。

理想情況下,您應該將您的ResultSet的內容物化爲一個正式集合並將該集合發送到JSP而不是ResultSet