[英]What gets cached in second level cache?
從Hibernate文檔(強調我的):
默認情況下, 實體不是二級緩存的一部分,我們建議您堅持使用此設置。 但是,您可以通過在persistence.xml文件中設置shared-cache-mode元素或在配置中使用javax.persistence.sharedCache.mode屬性來覆蓋它。
什么被緩存在二級緩存中?
你有一級緩存和二級緩存。 第一級緩存仍然在事務上,這就是為什么必須調用flush以便在使用相同行的事務之間保持一致的原因。 然而,二級緩存在事務之間共享。
緩存相同的對象,區別在於它們是否在會話之間共享。
默認情況下,禁用第二個緩存。
如果要使用二級緩存,請嘗試以下操作:
@Entity
@Table(name = "for_second_cache")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class ObjectForSecondCache{
private Set<Document> documents;
}
此外,您應該知道二級緩存有許多不同的提供程序。
Hibernate有2個緩存機制。
1.一級緩存:
它默認啟用,無法禁用。 它適用於會話中提供的緩存,即打開會話並執行數據庫調用時。
例如,如果您為特定id調用了session.get(<entity>, <id>)
,並且在關閉會話之前,如果再次使用相同的id調用它,那么Hibernate只會調用一次數據庫,存儲在第一級緩存; 而對於第二個,它只是從緩存中獲取它。
當執行session.save()
並且某些屬性更新(在會話中)時,您可以看到好處,然后它會觸發更新查詢以反映所做的更改,而無需調用session.update()
。
2.二級緩存:
一種。 緩存實體:
默認情況下禁用此選項,並且適用於各個會話 。 它通常用於在會話工廠內的不同會話之間維護緩存,但也可以縮放到多個群集。
啟用第二級緩存后,您還需要指定要考慮用於緩存的類/實體 。 這可確保Hibernate在調用數據庫之前查看二級緩存(和第一級緩存)並相應地更新緩存,以便可以從緩存本身提供/檢索更多請求。
例如,
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="cache.use_second_level_cache">true</property>
和
@Entity
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
public class EntityToBeCached ...
灣 緩存查詢:
同樣,需要顯式啟用查詢緩存以使查詢可緩存 。 僅當啟用了二級緩存時,這才有效。 在這種情況下,您需要通過對正在執行的查詢使用query.setCacheable(true)
以及在調用DB之前需要在緩存中查找的其他查詢來標記可緩存的查詢/查詢。
這是啟用二級緩存所必需的。
<property name="cache.query_cache">true</property>
描述已經很長了,但我希望你有這個想法:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.