首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

一個 Statement 多個 ResultSet 交替使用導致「ResultSet 已關閉」錯誤的原因與解法

     編輯:Java 相關知識

錯誤代碼

stmt = conn.createStatement();
rs  = stmt.executeQuery("select * from t1");
rst = stmt.executeQuery("select * from t2"); // 此行隱式關閉 rs
rs.last(); // 拋 SQLException: Operation not allowed after ResultSet closed

規範規定

By default, only one ResultSet object per Statement object can be open at the same time. All execution methods in the Statement interface implicitly close a statement's current ResultSet object if an open one exists.

同一 Statement 執行新查詢會隱式關閉前一個 ResultSet。

兩種正確模式

模式一:用完一個再開下一個 (單 Statement)

stmt = conn.createStatement();
rs = stmt.executeQuery("select * from t1");
rs.last(); // 立即處理完 rs
rst = stmt.executeQuery("select * from t2"); // 再開新的
rst.last();

模式二:多 Statement 各自對應 ResultSet (並發讀取)

stmt1 = conn.createStatement();
stmt2 = conn.createStatement();
rs  = stmt1.executeQuery("select * from t1");
rst = stmt2.executeQuery("select * from t2");
rs.last();
rst.last(); // 互不干擾

核心原則

一個 Statement 同一時刻只能擁有一個開啟的 ResultSet。若需同時持有多個結果集,必須建立多個 Statement。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved