2016-02-16 98 views
5

我試圖將Infinispan配置爲一個hibernate二級緩存。一切都很好,但我想調整默認配置,即所有緩存共享的值。Infinispan JPA二級緩存默認值

緩存是自動爲@Cache註釋的實體創建的,我可以在infinispan.xml<distributed-cache-configuratoin>中一個一個地自定義它們。但是,我希望爲所有這些緩存設置默認值(例如驅逐策略)。

另一件事,我想標記所有這些生成的緩存爲「分佈式」(默認情況下它們是「本地」)。

下面是從我infinispan.xml的exceprt:

<cache-container default-cache="default" statistics="true"> 
    <transport stack="external-file" /> 
    <!-- Configuring specifics for the User entity. How to do it globally? --> 
    <distributed-cache-configuration name="user" statistics="true" /> 
</cache-container> 

如何做這些事?

+1

默認緩存配置名爲'entity'。配置具有該名稱的緩存,它應該適用於所有實體。 –

+0

不錯..謝謝。你有沒有參考文件? – Bozho

+1

http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#caching-provider-infinispan-config –

回答

4

default cache configuration爲實體被命名爲entity

緩存配置可以不同對每種類型存儲在 高速緩存的數據。爲了代替高速緩存配置模板,使用 屬性hibernate.cache.infinispan.data-type.cfg其中data-type 可以是以下之一:通過@Id@EmbeddedId屬性索引

entity實體。

immutable-entity@Immutable註解標記的實體或在映射文件中將 設爲mutable=false的實體。

naturalid通過它們的@NaturalId屬性索引的實體。

collection所有藏品。

timestamps映射實體類型→上次修改時間戳。用於查詢緩存使用 。

query映射查詢→查詢結果。

pending-puts使用無效模式的區域的輔助高速緩存 高速緩存。

collectionimmutable-entitynaturalid默認也是entity指定的配置,這樣你就不必單獨配置它們(如果你不想當然單獨配置),如中可以看到documentationsource code

注意

在一般情況下,使分佈可能不是一個好主意Hibernate的二級緩存,因爲實體實例存儲在disassembled hydrated state在L2高速緩存,這意味着只有關聯實體的ID存儲在一起與父實體狀態。

假設你有以下實體(ABC都被緩存):

@Entity 
public class A { 
    @ManyToOne 
    private B b; 

    @OneToMany 
    private Collection<C> cs; 
} 

即使cs集合了超高速緩存也從緩存中完全組裝的實體A情況下,你將有以下網絡往返集羣的其他節點:

  1. 獲取實體A狀態。
  2. 根據存儲在b關聯中的ID獲取實體B狀態。
  3. 取得cs ID的集合。
  4. 對於cs集合中的每個id,請逐個獲取C實體狀態。

顯然,如果您正在彙集A實例的集合(例如查詢的結果),則上述所有操作都會針對A的每個實例執行。

這都意味着直接從數據庫讀取數據(使用正確配置的延遲加載,例如使用batch size)可能比分佈式緩存中的所有網絡往返效率高得多。另外,這也是實體/集合緩存應該在失效集羣模式下運行的原因之一(數據僅在讀/寫它的節點上緩存,但在更改時在其他節點上無效)。