繁体   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