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

EJB 回傳集合資料最佳方案:Vector vs RowSet (CachedRowSet) 深度比較

     編輯:Java 程式設計入門

問題背景

EJB 遠端介面回傳查詢結果集時,ResultSet 無法直接序列化傳輸。常見兩種方案:

  1. Vector/Collection:手動將 ResultSet 複製到記憶體集合
  2. RowSet (CachedRowSet):離線、可序列化的結果集封裝

方案一:Vector — 簡單但笨重

public Enumeration ejbFindBigAccounts(double balance) {
    Connection con = null;
    PreparedStatement ps = null;
    try {
        con = getConnection();
        ps = con.prepareStatement("SELECT id FROM accounts WHERE bal > ?");
        ps.setDouble(1, balance);
        ResultSet rs = ps.executeQuery();
        
        Vector v = new Vector();
        while (rs.next()) {
            v.addElement(rs.getString(1));
        }
        return v.elements(); // 回傳 Enumeration
    } catch (SQLException e) {
        throw new EJBException(e);
    } finally {
        close(con, ps);
    }
}

缺點:

  • 手動複製程式碼冗長
  • 失去結果集中繼資料 (欄位名、型別)
  • 無游標操作 (無法移動、篩選、排序)
  • 大量資料記憶體壓力大

方案二:RowSet (CachedRowSet) — 專業之選

什麼是 RowSet?

javax.sql.RowSet 介面繼承 ResultSet,支援離線操作、可序列化、JavaBean 屬性。Sun 參考實作提供三種:

  • CachedRowSet:通用離線結果集,**最常用**
  • JdbcRowSet:ResultSet 的 JavaBean 封裝 (需連線)
  • WebRowSet:支援 XML 序列化

環境配置 (JDK 1.4 / J2EE 1.2 內建無此類別)

  1. 下載 JDBC 2.0 Optional Package:
    https://developer.java.sun.com/developer/earlyAccess/crs/
  2. 解壓取得 rowset.jar
  3. 加入專案 classpath / IDE library path
  4. 匯入:import sun.jdbc.rowset.*;

伺服端實作:回傳 CachedRowSet

public CachedRowSet ejbFindBigAccounts(double balance) {
    Connection con = null;
    PreparedStatement ps = null;
    try {
        con = getConnection();
        ps = con.prepareStatement("SELECT * FROM accounts WHERE bal > ?");
        ps.setDouble(1, balance);
        ResultSet rs = ps.executeQuery();
        
        CachedRowSet crs = new CachedRowSetImpl(); // Sun 實作類
        crs.populate(rs); // 一鍵複製 ResultSet 內容與中繼資料
        return crs;       // 直接回傳,自動序列化傳輸
    } catch (SQLException e) {
        throw new EJBException(e);
    } finally {
        close(con, ps);
    }
}

客戶端使用:像操作 ResultSet 一樣

CachedRowSet crs = remote.ejbFindBigAccounts(10000);
crs.beforeFirst();
while (crs.next()) {
    System.out.println("ID: " + crs.getString("id") 
        + ", Balance: " + crs.getDouble("bal"));
}
// 甚至支援離線修改後同步回寫 (acceptChanges)
crs.setDouble("bal", newBal);
crs.updateRow();
crs.acceptChanges(conn); // 重新連線同步

深度比較

維度VectorCachedRowSet
程式碼量多 (手動迴圈複製)少 (populate 一行)
中繼資料保留無完整保留
游標操作無完整支援 (next/previous/absolute)
離線修改同步不支援支援 (acceptChanges)
XML 序列化需自行實作WebRowSet 原生支援
記憶體效率較低 (Object 封裝開銷)較高 (資料結構優化)
相依性零 (JDK 核心)需額外 rowset.jar

結論與建議

  1. 簡單主鍵清單、極小資料量:Vector 可接受
  2. 完整結果集、需離線操作、中繼資料、XML 輸出:首選 CachedRowSet
  3. 現代專案建議直接使用 JPA/Hibernate 或 Spring JdbcTemplate,RowSet 多用於舊版 EJB 維護專案
  4. 若受限於 JDK 1.4 環境,rowset.jar 部署成本極低,效益極大

CachedRowSet 實現了 ADO.NET DataSet 風格的離線資料操作,是 EJB 時代傳輸表格資料的黃金標準。

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