簡體   English   中英

Infinispan自定義攔截器不能與Hibernate L2緩存一起使用?

[英]Infinispan custom interceptors not working with Hibernate L2 cache?

在我的項目中,我必須攔截Hibernate L2緩存調用,以便為某些選定的緩存對象設置壽命。 問題在於,hibenate緩存調用永遠不會通過攔截器來。

我的攔截器(測試代碼)

public class HibernateCacheInterceptor extends BaseCustomInterceptor {
   private static Log log = LogFactory.getLog(HibernateCacheInterceptor.class);

@Override
public Object visitPutKeyValueCommand(InvocationContext ctx, PutKeyValueCommand command) throws Throwable {
    log.info(this.getClass().getName() + " intercept.");
      if (command.getValue() instanceof Car) {
          return null;
       } else {
          return invokeNextInterceptor(ctx, command);
      }
   }

 }

我的緩存定義(infinispan.xml)

 <namedCache name="mycache">
    <customInterceptors>
        <interceptor position="FIRST" class="test.HibernateCacheInterceptor">
        </interceptor>
    </customInterceptors>
</namedCache>

org.infinispan.Cache.put(key,value)調用進入攔截器,但是休眠緩存調用沒有。 休眠是否使用不同的API來跳過攔截器? 如何攔截休眠緩存調用?

不,Hibernate無法跳過攔截器-核心Infinispan的所有邏輯都是從攔截器觸發的。

我的猜測是Hibernate不使用緩存(當您打開JConsole時,您可以在Infinispan中看到條目嗎?),使用另一個緩存(沒有攔截器)或在插入到緩存之前緩沖條目。

您可以嘗試在休眠和infinispan上都設置跟蹤日志記錄。

有更簡單的方法可以實現此目的。 Infinispan 2LC文檔中所述 (請參閱高級配置部分),可以為每個實體分配一個特定的緩存,您可以在其中聲明性地調整設置。 最簡單的方法是檢查應用程序中使用的是Infinispan配置,復制用於實體的默認緩存,為其指定其他名稱並進行調整。 然后,您需要定義如下內容:

<property name="hibernate.cache.infinispan.com.acme.Person.cfg"
          value="person-entity"/>

其中person-entity是該特定實體的緩存名稱。

注意:請記住,如果您在Wildfly或EAP上運行,則屬性名稱需要指示部署存檔和持久性單元名稱。 在高級配置部分對此進行了說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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