首頁 >資料庫 >mysql教程 >使用 JDBC 時,為什麼我會收到「java.sql.SQLException:ResultSet 關閉後不允許操作」?

使用 JDBC 時,為什麼我會收到「java.sql.SQLException:ResultSet 關閉後不允許操作」?

DDD
DDD原創
2024-10-29 14:07:02941瀏覽

Why Am I Getting

Java - 連線關閉後無法使用結果集

問題:

問題:
java.sql.SQLException: Operation not allowed after ResultSet closed

嘗試使用JDBC執行資料庫查詢會導致下列錯誤:

分析:

JDBC 使用ResultSet 物件從查詢中擷取資料。但是,當與資料庫的連線關閉時,ResultSet 物件將變得無效且無法再使用。

解決方案:

要解決此問題,請避免透過ResultSet 物件超出執行查詢的方法。相反,使用 ResultSet 填入物件或清單並傳回結果物件。

<code class="java">public static Collection<T> sqlquery (String query, RowMapper<T> rowMapper) throws SQLException
{
    Connection connection=null;
    Statement st=null;
    ResultSet rs=null;     
    connection = DriverManager.getConnection("databaseadress","username","password");
    st = connection.createStatement();  
    rs = st.executeQuery(query);
    Collection<T> collection = new ArrayList<>();
    while (rs.next()) {
        collection.add(rowMapper.mapRow(rs));
    }
    // Close resources even if exceptions are thrown
    closeGracefully(rs, st, connection);
    return collection;
}</code>

填充物件的範例程式碼:

<code class="java">private static void closeGracefully(ResultSet rs, Statement st, Connection connection) {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) { /* Log or ignore */ }
    }
    if (st != null) {
        try {
            st.close();
        } catch (SQLException e) { /* Log or ignore */ }
    }
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) { /* Log or ignore */ }
    }
}</code>

優雅地關閉資源:

  • 其他注意事項:
  • 使用行映射器從ResultSet 的每一行建立物件。
參數化查詢以防止 SQL 注入攻擊。 考慮使用第三方程式庫(例如 JDBC 或 Spring JDBC)來簡化資料庫存取。

以上是使用 JDBC 時,為什麼我會收到「java.sql.SQLException:ResultSet 關閉後不允許操作」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn