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

會話 EJB 封裝存儲過程:實現業務邏輯復用與性能優化

     編輯:Java 相關知識

為什麼要在 EJB 中調用存儲過程?

  • 邏輯復用:避免將成熟的 DB 端業務邏輯重寫到 Java 中
  • 減少網絡往返:一次調用替代多條 SQL 語句,降低通信開銷
  • 性能優勢:存儲過程在 DB 服務器預編譯執行,效率更高
  • 維護集中:業務規則統一維護在數據庫層

架構決策:無狀態 vs 有狀態 Session Bean

推薦無狀態會話 Bean:資源消耗少、並發性能好、無會話狀態管理開銷。適用於封裝無會話親和性的存儲過程調用。

數據映射策略

輸入參數

直接映射為 EJB 方法參數,類型對應 Java 基本類型/包裝類。

輸出處理:DAB CallableStatement 方案

存儲過程可能返回:多個 OUT/INOUT 參數 + 多個結果集。需封裝為可序列化對象傳回客戶端。

IBM Data Access Bean (DAB) 庫 提供 com.ibm.db.CallableStatement,優勢:

  • 自動封裝所有輸出參數、結果集及元數據
  • 可序列化,符合 EJB 規範
  • 支持 JDBC 兼容的任意數據源,實現「與 DBMS 無關」

完整實現步驟

  1. 確認目標存儲過程(如 CLIENTREPORT:1輸入+2輸出+2結果集)
  2. 創建/選擇無狀態 Session Bean(如 Analysis)
  3. 擴展 Remote Interface 添加封裝方法:
    public interface Analysis extends EJBObject {
        CallableStatement lookupClient(Integer clientId) throws RemoteException;
    }
    
  4. 實現 Bean 方法核心邏輯:
    
    // 1. 獲取 DataSource (JNDI + 連接池)
    Context ctx = new InitialContext(env);
    DataSource ds = (DataSource) ctx.lookup("jdbc/LocalDB2Sample");
    Connection conn = ds.getConnection(user, pass);
    conn.setAutoCommit(false); // 容器管理事務
    
    // 2. 構建 CallableStatement 元數據
    StatementMetaData meta = new StatementMetaData();
    meta.setSQLString("{call CLIENTREPORT(?, ?, ?)}");
    meta.registerParameter("clientId", Types.INTEGER, ParameterMetaData.IN);
    meta.registerParameter("name", Types.VARCHAR, ParameterMetaData.OUT);
    meta.registerParameter("email", Types.VARCHAR, ParameterMetaData.OUT);
    
    CallableStatement cstmt = new CallableStatement();
    cstmt.setMetaData(meta);
    cstmt.setDatabaseConnection(new DatabaseConnection(conn));
    
    // 3. 設置輸入參數並執行
    cstmt.setParameter("clientId", clientId);
    cstmt.execute();
    
    // 4. 顯式獲取輸出參數(結果集自動緩存)
    cstmt.getParameter("name");
    cstmt.getParameter("email");
    
    return cstmt; // 返回封裝完整結果的對象
    
  5. 異常處理與資源釋放(finally 塊關閉 Statement、Connection)

客戶端通用調用模式

客戶端無需預知結果結構,完全依賴元數據動態解析:


// 1. 創建 EJB 引用
Context ctx = new InitialContext(env);
Object ref = ctx.lookup("ejb/Analysis");
AnalysisHome home = (AnalysisHome) PortableRemoteObject.narrow(ref, AnalysisHome.class);
Analysis bean = home.create();

// 2. 調用並處理返回的 CallableStatement
CallableStatement cs = bean.lookupClient(new Integer(123));

// 3. 通用參數處理
StatementMetaData rootMeta = cs.getMetaData();
for (int i=0; i

事務管理說明

使用 DataSource + 容器管理事務 (TX_REQUIRED) 時,無需顯式 commit/rollback,容器根據方法完成情況自動處理。

總結

此模式適用於任意存儲過程封裝,實現了:開發效率提升(復用現有邏輯)、運行性能優化(減少網絡交互)、架構靈活性(通用客戶端模式)。

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