并发创作活动

时间:2011-01-06 10:46:24

标签: hibernate jboss second-level-cache

我正在使用JBoss 5.1.0 GA和Hibernate,我现在正在尝试启用二级缓存。我已将以下属性添加到我的Hibernate配置中。

<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.MultiplexedJBossCacheRegionFactory"/>
<property name="hibernate.cache.jbc2.query.localonly" value="true"/>
<property name="hibernate.cache.region_prefix" value="my_prefix" />

我注释了一些实体,我希望不经常改变以下内容:

@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL)

这是基于我对documentation的了解。

应用程序成功部署,没有可怕的消息(例如,日志流中的WARN或ERROR消息)。在短时间内我看到缓存正在工作(我正在使用Hibernate统计信息来查看),但过了一会儿我得到了表单的堆栈跟踪(即使以单个用户身份登录而没有任何远程访问):

  

“交易试图创建   MYCLASS重新开始。它已经存在了   自此交易后创建   由另一个人(可能是远程的)开始   交易。我们有一个并发   创作活动“

跟随一个巨大的堆栈跟踪,最终追溯到我所创建的具有以下形式的命名查询:

SELECT x FROM X WHERE x.deleted = false

命名查询没有用于缓存的附加注释。

非常感谢任何有关如何解决这个问题的建议。

2 个答案:

答案 0 :(得分:1)

首先提出一些问题:

  1. 此异常是否已传播到您的应用程序?我的意思是,你受此影响,或者你只关心日志中的消息?
  2. 您的所有实体都是使用交易策略注释的,还是只有少数实体?
  3. 您的查询是否检索另一个类的急切获取的对象?
  4. 我想说你现在可以做的最好的事情就是为缓存操作启用DEBUG(或者甚至TRACE)日志记录:log4j.logger.org.hibernate.cache=debug这将告诉你Hibernate究竟在做什么。我怀疑 Hibernate试图将一个对象放到缓存中,并在同一个会话期间看到同一个对象时再次执行它(可能是另一个对象树的一部分)。一段时间之前,查询缓存存在时间戳问题,此处可能会出现同样的问题。例如:

    Object A#1
     -- Object B#1
    
    Object A#2
     -- Object B#1
    

    但同样,在不知道问题是什么的情况下预测解决方案有点困难。而且我担心只有Hibernate的日志可以告诉你问题究竟是什么。

    PS:这是作为评论发布的,但这对它来说太长了。

答案 1 :(得分:0)

您是否尝试过CacheConcurrencyStrategy.NONSTRICT_READ_WRITE?我经常阅读文档并且不知道要选择什么,但似乎对我的项目工作正常。我想CacheConcurrencyStrategy.TRANSACTIONAL太安全了,在某些情况下可以避免缓存性能。

相关问题