歷史演進:從 Client/Server 到 N 層架構
兩層架構痛點
- 客戶端承擔:UI + 業務邏輯 + 數據訪問 (Fat Client)
- 部署惡夢:數百客戶端升級、DLL 地獄、配置漂移
- 邏輯復用困難:業務邏輯綁定在特定 UI 技術 (VB/PowerBuilder/Delphi)
- 擴展性瓶頸:數據庫連接數線性增長、鎖爭用劇烈、無法水平擴展應用邏輯
- 協議綁定:專有數據庫協議、中間件鎖定
J2EE 多層架構重塑
+------------------+ +------------------+ +------------------+ +------------------+
| Client Tier | | Web Tier | | Business Tier | | EIS Tier |
| (Browser/Applet |←→ | (Servlet/JSP/ |←→ | (Session Bean/ |←→ | (Database/ERP/ |
| Java Web Start)| | JSF/Struts) | | Spring Service)| | Legacy/MQ) |
+------------------+ +------------------+ +------------------+ +------------------+
↑ ↑ ↑ ↑
表現邏輯 動態頁面生成 核心業務邏輯 數據訪問/集成
用戶交互 控制器/視圖 事務/安全/持久門面 JDBC/JCA/JMS
- 關注點分離:每層專注單一職責,獨立開發、部署、擴展、技術棧演進
- 標準化組件模型:Servlet、JSP、EJB、JCA 定義契約,容器提供通用服務
- 聲明式中間件服務:事務、安全、資源池、命名、消息、管理 — 開發者零代碼享用
JDBC:統一數據訪問標準
四類驅動架構演進
| 類型 | 架構 | 優點 | 缺點 | 定位 |
| Type 1: JDBC-ODBC Bridge | JDBC → ODBC → DB | 早期通用性 | 需客戶端裝 ODBC、Windows 綁定、雙重轉換性能差 | 已淘汰 |
| Type 2: Native API | JDBC → Native Client Lib → DB | 性能優於 Type 1 | 需客戶端裝 Native Lib、平台綁定 | Oracle OCI 等老牌驅動 |
| Type 3: Network Protocol | JDBC → Middleware Server → DB | 純 Java、無客戶端安裝、支持連接池/負載均衡 | 中間件單點、雙網絡跳轉 | 早期三層架構方案 |
| Type 4: Pure Java (Direct) | JDBC → DB Native Protocol (Pure Java) | 零部署、跨平台、直連、高性能、支持連接池 | 需 DB 廠商提供純 Java 協議實現 | 現代標準 (MySQL Connector/J, PostgreSQL JDBC, Oracle Thin, SQL Server JDBC) |
企業級 JDBC 最佳實踐
// 1. 數據源注入 (JNDI 查找或 Spring 注入)
DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/MyDB");
// 2. 連接池配置
// 生產環境必用連接池 (HikariCP/Druid/Tomcat DBCP),避免頻繁建立/銷毀連接開銷
// 3. 標準操作模板
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = ds.getConnection(); // 從池獲取
conn.setAutoCommit(false); // 事務邊界控制
ps = conn.prepareStatement(sql); // 預編譯防注入、優化複用
ps.setString(1, param); // 參數綁定
rs = ps.executeQuery(); // 執行查詢
while (rs.next()) { ... } // 流式處理結果集
conn.commit(); // 提交事務
} catch (SQLException e) {
if (conn != null) conn.rollback(); // 回滾
throw new DAOException(e);
} finally {
closeQuietly(rs, ps, conn); // 必須歸還連接到池
}
WebLogic JDBC 進階特性
- 多數據源:負載均衡/故障轉移算法 (Round Robin/Failover)、XA/非 XA 混合
- 連接池優化:
InitialCapacity、MaxCapacity、CapacityIncrement、ShrinkPeriodMinutes、TestConnectionsOnReserve、TestTableName (如 SELECT 1 FROM DUAL)
- 語句緩存:
PreparedStatement Cache Size、PreparedStatement Cache Profiling
- 分布式事務:JTA/XA 驅動、兩階段提交、事務日志持久化、恢復服務
- RowSet:斷開連接的結果集 (
CachedRowSet、WebRowSet),支持序列化傳遞、XML 導入導出
JNDI 在 WebLogic 中的實踐
資源配置與查找
// config.xml (域配置) 片段
<jdbc-system-resource>
<name>MyDB</name>
<jdbc-resource>
<jndi-name>jdbc/MyDB</jndi-name> <-- 全局 JNDI 名稱 -->
<jdbc-driver-params>
<url>jdbc:oracle:thin:@host:1521:SID</url>
<driver-name>oracle.jdbc.OracleDriver</driver-name>
<properties><property name="user" value="scott"/><property name="password" value="tiger"/></properties>
</jdbc-driver-params>
<jdbc-connection-pool-params>
<initial-capacity>5</initial-capacity>
<max-capacity>20</max-capacity>
<test-table-name>SELECT 1 FROM DUAL</test-table-name>
</jdbc-connection-pool-params>
</jdbc-resource>
</jdbc-system-resource>
// 應用查找 (標準 java:comp/env 映射)
jdbc/MyDB // 應用邏輯名
javax.sql.DataSource
Container
// weblogic.xml (應用級映射)
jdbc/MyDB
jdbc/MyDB // 映射到全局 JNDI
WebLogic 應用服務器:J2EE 參考實現
核心價值主張
- 簡化分布式開發:容器托管事務、安全、連接池、線程池、負載均衡、故障轉移、部署、管理
- 標準合規:通過 Sun J2EE 1.4 認證,緊跟規範演進 (EJB 3.0、JPA、JAX-WS、JAX-RS)
- 生產級質量:24×7 支持、HP/Novell/CA/Unisys 合作伙伴生態、關鍵任務系統驗證
- 創新引領:JMX 微內核、SOA 架構、熱部署類加載器、JRockit JVM、AOP 集成、FastSwap 類重定義
WebLogic 核心服務矩陣
| 服務 | J2EE 標準 | WebLogic 增強 |
| 事務 | JTA 1.0.1 | 高性能事務管理器、跨域事務、事務日志磁盤/數據庫存儲 |
| 安全 | JAAS/JACC | 嵌入式 LDAP、SAML 2.0、XACML 授權、PKI/雙向 SSL |
| 消息 | JMS 1.1 | 分布式隊列/主題、單元次序、存儲轉發、JMS SAF |
| 命名 | JNDI 1.2 | 集群化 JNDI 樹、外部 LDAP 整合、複製綁定 |
| 管理 | JMX 1.2 | 管理控制台、WLST 腳本、SNMP、REST 管理 API、診斷框架 |
| 部署 | JSR-88 | 生產重部署、版本管理、應用庫、計劃部署、FastSwap |
總結:J2EE 架構師必備認知
- 架構分層 是應對複雜性的唯一出路,J2EE 提供標準化分層契約
- JDBC Type 4 + 連接池 + DataSource + JNDI 是數據訪問的黃金組合
- 容器服務聲明式使用,業務代碼零侵入,專注領域邏輯
- WebLogic 等商業級容器 將標準轉化為生產級能力,是關鍵任務系統的穩定基石
- 技術演進本質:EJB → Spring POJO、JSP → Template Engine、RMI → REST/gRPC、JMS → Kafka、XML → JSON — 核心契約 (事務、安全、命名、資源管理) 永恆不變