正如城市供水系統透過水庫(緩存)與管網(連接池)實現「按需取水、資源複用」,資料庫存取同樣依賴兩大基礎設施:
| 參數 | 含義 | 調優建議 |
|---|---|---|
cache.size | 緩存最大頁數 | 設為質數以減少哈希衝突;依查詢結果集大小預估,避免過大導致 GC 壓力 |
cache.checkpointinterval | 檢查點間隔(頁刷新頻率) | 依業務對數據時效性容忍度設定;高一致性需求縮短間隔,高吞吐場景拉長間隔 |
SQLCaching.size | 緩存 SQL 执行計劃數量 | 高重複 SQL 系統設大;動態 SQL 多設 0 關閉 |
SELECT * FROM PRODUCT_TBL)| 執行次序 | 總耗時 | 編譯耗時 | 說明 |
|---|---|---|---|
| 首次 | 1082 ms | 771 ms | 冷啟動:含解析、編譯、磁碟讀取 |
| 緊接第二次 | 160 ms | 0 ms | 計劃緩存命中,省去編譯 |
| 第三次 | 91 ms | 0 ms | 數據頁緩存命中,純記憶體讀取 |
| 冷卻 30 秒後 | 210 ms | 20 ms | 計劃仍在緩存,部分數據頁被換出 |
結論:緩存熱啟動後效能提升 10 倍以上,參數調優直接決定命中率曲線。
| 參數 | 業務含義 | 設定策略 |
|---|---|---|
| Minimum Pool Size | 空閒保底連接數 | 設為基線並發數,避免冷啟動延遲 |
| Maximum Pool Size | 並發上限 | 依資料庫最大連接數、應用伺服器執行緒數、CPU 核心數三者取最小 |
| Connection Timeout | 滿池等待上限 | 設 3-10 秒,過長導致請求堆積,過短誤判擁塞 |
| Idle Timeout | 空閒回收門檻 | 60-300 秒,平衡連接複用與資料庫端空閒連接佔用 |
| Orphan Timeout | 借出連接最大持有時間 | 防止業務邏輯死鎖佔用連接,建議 30-60 秒強制回收 |
// 場景 1:JDBC 1.0 —— 每請求建立物理連接(反模式)
Connection conn = DriverManager.getConnection(url, user, pass);
try { /* 業務邏輯 */ } finally { conn.close(); /* 物理斷開 */ }
// 場景 2:JDBC 2.0 + 連接池 —— 借用邏輯連接(最佳實踐)
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/MyPool");
Connection conn = ds.getConnection(); // 從池借用,極快
try { /* 業務邏輯 */ } finally { conn.close(); /* 歸還池中,非物理斷開 */ }
實測高併發場景下,連接池可將「獲取連接」耗時從 200-500 ms 降至 0.1-1 ms,系統吞吐量提升 5-10 倍。
高速緩存解決「讀什麼、怎麼快」,連接池解決「怎麼連、連得快」。二者互為表裡,共同構建資料庫存取效能的基石。參數調優無銀彈,唯有「監測→假設→驗證→固化」的科學循環,方能榨乾硬體紅利。