許多開發者習慣將「資料庫資料」等同於「系統狀態」。實則不然:
系統運行時主要操作的是活動狀態。若直接以資料庫取代記憶體狀態,會導致頻繁 I/O、破壞物件封裝、產生貧血模型,系統退化為傳統兩層架構。
| 範圍 | 生命週期 | 適用場景 | 風險 |
|---|---|---|---|
| Request | 單次 HTTP 請求 | 表單資料、暫時計算結果 | 請求結束自動銷毀,安全 |
| Session | 用戶會話期間 | 購物車、登入用戶資訊 | 記憶體洩漏高風險,叢集需同步 |
| Application | Web 應用存活期間 | 快取資料、系統配置、共享常數 | 併發寫入需同步,啟動載入慢 |
OsCache、Ehcache、Redis 等快取中介軟體,支援 LRU 淘汰、分散式同步。OsCache、Ehcache 配置於 web.xml 或程式碼初始化。領域模型類別實作特定介面/繼承基類,框架自動攔截持久化操作,透明整合快取:
// 領域模型
public class Forum extends DomainModel {
private String name;
private String description;
// 狀態欄位:最新貼文、貼文數 — 生命週期短、變動頻繁
private Post latestPost;
private int postCount;
}
框架基於 IoC/AOP,底層快取實作可熱插拔 (OsCache → Redis),業務碼零侵入。
Forum 範例:
分離依據:生存週期不同。不熟悉業務領域時,難以精準切分。MDA 四色原型 (Archetype) 可輔助識別:Moment-Interval (粉紅) 代表業務事件產生的臨時狀態。
| 技術 | 靜態設計 (IoC/AOP) | 動態設計 (狀態管理) | 定位 |
|---|---|---|---|
| EJB 2/3 | 重 (XML/Annotation) | 強 (Stateful Bean, 叢集) | 分散式企業應用 |
| Spring | 極強 (IoC/AOP 标杆) | 弱 (僅 ThreadLocal Scope) | 單體/微服務基礎設施 |
| Jdon | 良好 (IoC/AOP) | 強 (Session/Cache 透明管理) | 輕量級領域驅動設計 |
掌握狀態的生命週期、併發特性、快取策略,是從「寫 CRUD」進化為「設計領域模型」的分水嶺。框架能簡化管道,但狀態建模的決策永遠屬於架構師。