使用HazelCast进行休眠缓存:JPA缓存基础知识
HazelCast的最大功能之一就是對hibernate二級緩存的支持 。
JPA具有兩個級別的緩存。
一級緩存在事務期間緩存對象的狀態(tài)。 通過查詢相同的對象兩次,您必須獲得第一次獲取的對象。
但是,在包含您檢索到的對象并訪問數(shù)據(jù)庫的復雜查詢的情況下,結(jié)果可能會不同步,因為結(jié)果不會反映您在事務處理期間應用于內(nèi)存中對象的更改。 但是,您可以使用flush()解決此問題。 啟動JPA會話后,其第一級緩存將限制為該會話,它將不會影響其他會話。 一級緩存是JPA的一部分
與第一級緩存相反,第二級緩存與會話工廠關(guān)聯(lián),因此第二級緩存在會話之間共享。 常用數(shù)據(jù)可以存儲在內(nèi)存中并可以更快地檢索。
啟用第二級緩存后,休眠將在休眠區(qū)域中緩存檢索到的實體。 為此,您必須將實體設置為可緩存。 在幕后,駐留在實體中的信息以脫水格式緩存。
Hazelcast可以在兩種形式的體系結(jié)構(gòu)中與二級緩存一起使用。
客戶端服務器或僅群集的體系結(jié)構(gòu)。
首先,我們將研究僅集群體系結(jié)構(gòu)。 Hazelcast為每個Hibernate緩存區(qū)域創(chuàng)建一個單獨的分布式映射,因此是一個實體。 您可以通過Hazelcast映射配置輕松配置這些區(qū)域。該區(qū)域的名稱具有相應的hazelcast映射。 例如,我們的實體之一稱為用戶,完整的包路徑為“ com.gkatzioura.User”,那么我們的榛樹廣播將名為“ com.gkatzioura.User”。 假設此地圖分布在所有hazelcast節(jié)點上,則從一個節(jié)點檢索到實體后,緩存的信息將與其他hazelcast節(jié)點共享。 一旦實體在節(jié)點中更新,則緩存的信息將在其他節(jié)點中失效。
Hibernate還為我們提供了查詢緩存。 查詢緩存是緩存查詢結(jié)果的緩存。 例如,在jpql查詢的情況下
SELECT usr.username,usr.firstname FROM User usr緩存的結(jié)果將是一個具有由查詢和參數(shù)組成的鍵的映射
以及檢索結(jié)果的值。 在先前的緩存中,檢索到的數(shù)據(jù)是原始值,它們按原樣存儲。
但是,在某些情況下查詢可能會檢索實體。
例如
在這種情況下,不是存儲所有檢索到的信息,而是檢索實體并將其緩存在第二級緩存中,而查詢緩存具有使用查詢及其參數(shù)作為鍵并將實體id作為值的條目。
一旦再次發(fā)出相同的查詢,查詢緩存將獲取ID,并將在第二級緩存中查找對應的實體。 如果第二級緩存中不存在實體,則發(fā)出查詢以獲取丟失的實體。
當涉及二級緩存和查詢緩存的配置時,我們需要注意二級緩存和查詢緩存的逐出機制。 在將ID高速緩存在查詢高速緩存中的情況下,您可能會感到迷惑,但是從第二級高速緩存中逐出了它們對應的實體。 在這種情況下,性能會受到影響,因為休眠將為每個丟失的實體發(fā)出查詢。
Hazelcast支持二級緩存,但是它是節(jié)點本地的,并且從未在Hazelcast群集中分布。
盡管從查詢中獲取的結(jié)果仍保留在特定節(jié)點上,但應從用作第二級緩存的分布式映射中檢索從緩存的查詢指定的實體。
到目前為止,這是我們需要的理論。 在下一個博客中,我們執(zhí)行一些spring數(shù)據(jù)jpa代碼和一些hazelcast配置。
翻譯自: https://www.javacodegeeks.com/2017/02/hibernate-caching-hazelcast-jpa-caching-basics.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的使用HazelCast进行休眠缓存:JPA缓存基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓登陆谷歌账号教程(安卓登陆谷歌)
- 下一篇: 绍兴电动车防盗备案号可以上路吗(绍兴电动