Application 物件特性
- 生命週期: 應用程式啟動建立,關閉銷毀,全域單一實例
- 範圍: 所有用戶、所有 Session 共享
- 對比 Session: Session 針對單一用戶,隨用戶離開消失;Application 針對整個應用,持久存在
- 類比: 系統級「全域變數」,類似常駐記憶體的 Servlet
MVC 控制層應用
傳統 MVC 用 Servlet 做控制器,隨著 JSP 功能完善,可用 scope="application" 的 JavaBean 替代 Servlet:
- 控制邏輯封裝於 JavaBean
- JSP 以
<jsp:useBean id="ctrl" class="ControllerBean" scope="application"/> 取得
- Bean 常駐記憶體,與後台中介軟體互動
- 省去 Servlet 配置與映射麻煩
首頁高併發優化經典案例
場景: 首頁需從資料庫讀取樹狀分類目錄並展開顯示,訪問量極高。
優化前:
每次請求 → 建立 Bean → 讀取資料庫 → 輸出 → 銷毀 Bean
優化後:
<jsp:useBean id="homeData" class="HomeDataBean" scope="application" />
<%
// Bean 內部實作快取演算法
// 首次載入讀資料庫建立記憶體樹狀結構
// 後續請求直接回傳記憶體資料
CategoryTree tree = homeData.getCategoryTree();
%>
效果:
- 資料庫查詢從「每請求一次」降為「應用啟動一次」或「定時刷新」
- 回應時間從百毫秒級降至微秒級
- 資料庫負載大幅降低
Application 使用最佳實踐
| 原則 | 說明 |
| 僅存放共享、只讀、低頻變更資料 | 如配置資訊、字典表、緩存物件 |
| 避免存放大量資料 | 佔用 Heap 記憶體,影響 GC 與擴展性 |
| 多執行緒安全 | 寫入操作需 synchronized 或使用 ConcurrentHashMap |
| 提供刷新/重載機制 | 管理介面觸發清除重建,或定時任務更新 |
| 叢集環境同步 | 單機 Application 不共享,需外部快取 (Redis/Memcached) |
程式碼範例:安全的 Application 計數器
public class AppCounter {
private static final ConcurrentHashMap<String, AtomicLong> counters = new ConcurrentHashMap<>();
public static long increment(String key) {
return counters.computeIfAbsent(key, k -> new AtomicLong(0)).incrementAndGet();
}
public static long get(String key) {
AtomicLong counter = counters.get(key);
return counter != null ? counter.get() : 0;
}
}
// JSP 使用
<%@ page import="com.example.AppCounter" %>
總訪問次數:<%=AppCounter.increment("total_visits")%>
- 上一篇文章: 建構 JSP/JavaBean 開發與部署環境最佳組合
- 下一篇文章: JSP 基本語法與簡單表單處理完整教學
Copyright ©
程式碼之家 All Rights Reserved