前言
採用hibernate的JPA實現,對於簡單的查詢十分方便。而對於複雜查詢我們也可以寫SQL來進行復雜的多表連線查詢。很多人不喜歡hibernate其實更多的是對其機制的掌握不深,如果認真研究其實現原始碼,其實是一個很快樂的學習過程。各種設計正規化的運用也是精彩絕倫。
這裡主要說下快取的配置。既然是hibernate,其快取機制離不開這三種:session級別的快取、sessionFactory級別的二級快取以及查詢快取和帶有集合的快取。對於jpa的使用,個人建議不要使用關係對映。這樣會導致各種關聯查詢,涉及到延遲載入等機制,會消耗額外的cglib的大量代理工作。尤其是很多人還使用org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter來實現集合的頁面懶載入。這對http響應要求很高的系統簡直就是災難。
使用jpa要放棄hibernate的關係對映部分,保持開發的簡潔和靈活性。
先上測試程式碼
|
|
一級快取
也就是自建的session級別的快取,在一個session回話事物中根據主鍵查詢是隻會查詢一次資料庫的。
|
|
控制檯列印:
|
|
執行entityManager.close();
entityManager關閉後會重新執行一次sql查詢
二級快取
二級快取預設是關閉的,需要配置快取策略
|
|
然後在需要使用快取的entity配置好快取註解
|
|
當然還要配置好ehcache.xml
|
|
執行測試程式碼會發現兩次執行只有一次sql查詢
查詢快取
前兩種都是對主鍵查詢時候的快取,對於普通的sql查詢我們可以在repository中配置hints
|
|
執行測試程式碼
|
|
控制檯輸出
|
|
這可以看到第二次執行同樣的查詢會有L2C快取命中
總結
如何配置二級快取和注意事項
- 首先需要新增pom依賴
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 複製程式碼
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>${spring-data-jpa.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>${hibernate.version}</version> </dependency> 複製程式碼
一定要注意ehcache和hibernate的版本要一致,不然啟動會報錯。
- 修改jpa配置
1 2 3 4 5 6 7 複製程式碼
<prop key="hibernate.generate_statistics">true</prop> <!-- 配置二級快取 --> <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> <!-- 開啟查詢快取 --> <prop key="hibernate.cache.use_query_cache">true</prop> <prop key="hibernate.cache.provider_configuration">classpath:ehcache.xml</prop> 複製程式碼
這裡開啟了二級快取和查詢快取,指定了ehcache快取的配置檔案statistics是個除錯開關,可以查詢快取的命中情況
- ehcache.xml配置
1 2 3 4 5 6 7 複製程式碼
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> 複製程式碼
timeToIdleSeconds
這個是快取的最大空閒時間,也就是多久不訪問自動失效timeToLiveSeconds
這個是最大存活時間,如果在存活時間內空閒時間達到上限,快取也會自動失效。
4)給entity配置快取策略
|
|
cacheable主要對集合類的快取提供支援,快取策略這裡適合資料更新不多的情況進行設定。
end
使用二級快取和查詢快取要注意使用場景,如果發現增加快取機制系統反而出現吞吐下降頻發當機。就要考慮是不是該換memcache等專門的快取伺服器了。