![](/img/trans.png)
[英]Connection lock using infinispan and hibernate on distributed cache 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.