簡體   English   中英

什么被緩存在二級緩存中?

[英]What gets cached in second level cache?

從Hibernate文檔(強調我的):

默認情況下, 實體不是二級緩存的一部分,我們建議您堅持使用此設置。 但是,您可以通過在persistence.xml文件中設置shared-cache-mode元素或在配置中使用javax.persistence.sharedCache.mode屬性來覆蓋它。

什么被緩存在二級緩存中?

你有一級緩存和二級緩存。 第一級緩存仍然在事務上,這就是為什么必須調用flush以便在使用相同行的事務之間保持一致的原因。 然而,二級緩存在事務之間共享。

緩存相同的對象,區別在於它們是否在會話之間共享。

默認情況下,禁用第二個緩存。

  1. 如果你試圖加載一個entiry,hibernate嘗試在第一級現金中找到它。 如果第一級緩存中沒有緩存實體,則查找第二級緩存以獲取緩存實體。
  2. 如果二級緩存具有緩存實體,則它將作為load方法的結果返回。 但是,在返回實體之前,它還存儲在第一級緩存中,以便下一次調用實體的加載方法將從第一級緩存本身返回實體,並且不需要再次進入二級緩存。

如果要使用二級緩存,請嘗試以下操作:

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM