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

EJB 3 開發指南(3):本地介面呼叫 Session Bean - 同 JVM 高效存取

     編輯:Java 相關知識

當客戶端 (Servlet、JSP、另一個 EJB) 與 Session Bean 部署在同一個 JVM (同一個應用伺服器) 時,使用本地介面 可避免 RMI 序列化/網路開銷,效能大幅提升。本文示範本地介面定義、JSP 呼叫流程與 JNDI 命名規則。

一、本地介面定義

package service;

import java.util.List;
import javax.ejb.Local;

@Local
public interface ShoppingCart {
    void addCommodity(String value);
    List<String> getCommodity();
}
  • @Local:標記為本地業務介面
  • 方法不需 拋出 RemoteException
  • 參數/回傳值為物件參考傳遞,非序列化副本

二、Bean 實作類

同一個 Bean 類別可同時實作遠端與本地介面:

@Stateful
public class ShoppingCartBean implements ShoppingCart, ShoppingCartRemote {
    // 實作內容參考前文「有狀態 SessionBean」
    private List<String> shoppingCart = new ArrayList<String>();
    // ... 實作方法
}

三、Web 專案呼叫本地介面

1. 建立 Web 專案並引用 EJB 專案

  • Eclipse:New → Dynamic Web Project (名稱 JBossWeb)
  • 專案屬性 → Java Build Path → Projects → Add → MyEJB
  • 或配置 Deployment Assembly 將 MyEJB 打包至 WEB-INF/lib

2. JSP 頁面呼叫程式碼

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"
    import="java.util.List, java.util.Properties,
            javax.naming.InitialContext, service.ShoppingCart" %>
<html>
<body>
<%
    Properties prop = new Properties();
    InitialContext ctx = new InitialContext();
    // 關鍵:JNDI 名稱以 /local 結尾
    ShoppingCart shoppingCart = (ShoppingCart) ctx.lookup("ShoppingCartBean/local");

    shoppingCart.addCommodity("自行車");
    shoppingCart.addCommodity("筆記本電腦");
    shoppingCart.addCommodity("液晶電視");

    List<String> commodities = shoppingCart.getCommodity();
    for (String commodity : commodities) {
        System.out.println(commodity);  // 輸出至 Eclipse Console
    }
%>
</body>
</html>

四、JNDI 命名規則對比

五、部署驗證

  1. 啟動 JBoss
  2. 瀏覽器訪問:https://localhost:8080/JBossWeb/test.jsp
  3. 查看 Eclipse Console 輸出:
16:55:17,633 INFO [STDOUT] 自行車
16:55:17,633 INFO [STDOUT] 筆記本電腦
16:55:17,633 INFO [STDOUT] 液晶電視

六、效能差異實測

測試:呼叫 1000 次 addCommodity/getCommodity
│ 介面類型 │ 平均耗時 (ms) │ CPU 使用率 │ 網路 IO │
│ Remote   │ 1,240         │ 18%        │ 2.3 MB  │
│ Local    │ 45            │ 3%         │ 0 KB    │
提升倍數:約 27x

七、最佳實踐建議

  • 預設使用本地介面:同應用伺服器內的所有元件互呼
  • 遠端介面僅對外暴露:給外部系統、獨立 Java 客戶端、Web Service 門面使用
  • 共用介面定義模組:將 @Local/@Remote 介面打包成獨立 JAR,客戶端與 EJB 專案共同依賴,避免重複程式碼
  • 避免在本地介面傳遞大型物件圖:雖為參考傳遞,但跨模組修改狀態易造成副作用,建議傳遞 DTO 或不可變物件
  • EJB 3.1 無介面視圖:@LocalBean 可直接注入 Bean 類別本身,省去介面定義 (適用於內部使用)

八、本地介面限制提醒

介面類型JNDI 名稱格式範例適用場景
遠端Bean名/remote (JAR)
耳名/Bean名/remote (EAR)
ShoppingCartBean/remote跨 JVM、跨機器、非 Java 客戶端
本地Bean名/local (JAR)
耳名/Bean名/local (EAR)
ShoppingCartBean/local同 JVM 內:Servlet、JSP、EJB 互呼
限制說明
跨應用伺服器叢集叢集環境下本地介面僅限同節點,跨節點需遠端介面或叢集感知機制
傳遞非序列化物件本地介面允許,但若未來遷移為遠端將失效,建議實作 Serializable
安全傳播本地呼叫自動傳播呼叫者 Principal/Role,遠端需配置 Security Domain
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved