電商首頁熱點商品訪問頻次極高,若每次請求均查詢數據庫將造成嚴重性能瓶頸。第 16 戰引入 Hibernate 二級緩存,基於 EhCache 實現 SessionFactory 級數據共享,實現熱點商品詳情頁「零 SQL」訪問,本文詳細記錄從基礎配置到高級調優的完整過程。
從 hibernate-release-4.3.11.Final/lib/optional/ehcache 獲取 hibernate-ehcache-4.3.11.Final.jar 及 ehcache-core-2.4.3.jar。
hibernate.cfg.xml 核心配置<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<class-cache usage="read-only" class="cn.it.shop.model.Product"/>
read-only:適合極少變更的熱點數據(商品詳情),並發性能最優Serializable| 查詢方式 | 方法示例 | 二級緩存支持 | 說明 |
|---|---|---|---|
| Session API | get(), load(), save(), update(), delete() | 支持 | read-only 下 update/delete 會拋異常,需改 read-write |
| HQL 查詢 | list(), iterate() | 支持 | 結果放入緩存,供下次 get/load 直接命中 |
| HQL 更新/刪除 | executeUpdate() | 不支持 | 直達數據庫,HB 負責同步緩存失效 |
默認配置來自 ehcache-failsafe.xml,生產環境需自定義 src/ehcache.xml:
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="60"
timeToLiveSeconds="120"
overflowToDisk="true"
memoryStoreEvictionPolicy="LFU"
/>
</ehcache>
maxElementsInMemory:內存最大對象數,電商熱點商品設 1000eternal:false 允許 TTL/TTI 生效timeToIdleSeconds:閒置 60 秒淘汰timeToLiveSeconds:生存 120 秒強制淘汰overflowToDisk:內存不足溢寫磁盤,防 OOMmemoryStoreEvictionPolicy:LFU(最少使用頻率) 優於 LRU/FIFO,完美契合熱點商品高頻訪問特性所有測試通過,確認配置生效。
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="60"
timeToLiveSeconds="120"
overflowToDisk="true"
memoryStoreEvictionPolicy="LFU"
/>
結合定時器每 6 小時刷新首頁緩存,二級緩存承擔詳情頁高併發讀取,雙層緩存體系將數據庫 QPS 降低 90% 以上。
Serializableread-only 實體禁止調用 session.update/deletesessionFactory.getCache().evictEntityRegion()二級緩存不是銀彈,但用對場景(高讀低寫、數據相對穩定、容忍秒級不一致)能帶來指數級性能提升。