[英]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.