Infinispan自定义拦截器不适用于Hibernate L2缓存



在我的项目中,我必须拦截Hibernate二级缓存调用,以便为一些选定的缓存对象设置寿命。问题是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缓存调用?

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

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

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

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

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

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

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

最新更新