Infinispan自定义拦截器无法使用Hibernate L2缓存?

时间:2015-02-23 13:07:38

标签: java hibernate infinispan second-level-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)调用来到拦截器但是hibernate缓存调用没有到来。 hibernate是否使用不同的API来跳过拦截器?我如何拦截hibernate缓存调用?

2 个答案:

答案 0 :(得分:1)

不,Hibernate不能跳过拦截器 - 核心Infinispan的所有逻辑都是从拦截器触发的。

我的猜测是Hibernate不使用缓存(当你打开JConsole时,你能看到Infinispan中的条目吗?),使用另一个缓存(没有拦截器)或者在插入缓存之前缓冲条目。

您可以尝试在休眠和infinispan上设置跟踪日志记录。

答案 1 :(得分:1)

有更简单的方法来实现这一目标。如Infinispan 2LC documentation中所示(请参阅高级配置部分),可以为每个实体分配一个特定的缓存,您可以在其中以声明方式调整设置。最简单的方法是检查应用程序中使用的Infinispan配置,复制用于实体的默认缓存,给它一个不同的名称并进行调整。然后,您需要定义类似的内容:

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

其中person-entity是该特定实体的缓存名称。

注意:请记住,如果您在Wildfly或EAP上运行,则属性名称需要指示部署存档和持久性单元名称。高级配置部分对此进行了解释。