在 JDBC 開發中,`ResultSet` 默認是「連接型」的——必須保持數據庫連接打開才能游標移動、讀取數據。一旦連接關閉,`ResultSet` 即失效。這在長事務、分層架構傳遞數據、連接池資源緊張等場景下極不方便。CachedRowSetImpl 應運而生,它實現了離線結果集模式:數據讀入內存後即可關閉連接,隨時隨地斷開線操作數據。
com.sun.rowset.CachedRowSetImpl(Sun/Oracle 實現,屬於 JDK 擴展包)javax.sql.rowset.BaseRowSetjavax.sql.RowSetjavax.sql.RowSetInternaljava.io.Serializable(支持序列化傳輸)java.lang.Cloneablejavax.sql.rowset.CachedRowSet(核心離線接口)// 1. 獲取連接並查詢
Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE dept_id = ?");
ps.setInt(1, 10);
ResultSet rs = ps.executeQuery();
// 2. 填充 CachedRowSetImpl
CachedRowSetImpl crs = new CachedRowSetImpl();
crs.populate(rs); // 將 ResultSet 數據全部讀入內存
// 3. 立即釋放數據庫資源!關鍵優勢
rs.close();
ps.close();
conn.close(); // 連接歸還池中,不再佔用
// 4. 業務層/表現層自由操作數據
while (crs.next()) {
System.out.println(crs.getString("username"));
// 甚至可以修改
crs.updateString("status", "ACTIVE");
crs.updateRow();
}
// 5. 如需持久化,重新獲取連接同步
Connection conn2 = dataSource.getConnection();
crs.acceptChanges(conn2); // 批量提交修改
conn2.close();
RowSetProvider.newFactory().createCachedRowSet() (JDBC 4.1+)。`CachedRowSetImpl` 是 JDBC 中實現「離線操作」的利器,適合中小結果集、跨層傳遞、長會話只讀場景。善用它能釋放寶貴的數據庫連接資源,簡化分層架構數據流轉。但請謹記:非標準 API、大數據慎用、并發衝突需處理。