【问题标题】:Concurrent Creation Event并发创建事件
【发布时间】:2011-06-04 14:03:15
【问题描述】:

我将 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

命名查询没有额外的缓存注释。

任何有关如何解决此问题的建议将不胜感激。

【问题讨论】:

  • 不确定它会有所帮助,但我会尝试使用缓存的锁定和隔离设置。
  • 这确实有帮助 - 切换到使用 pessimistic-entity 而不是 mvcc-entity,一切又好了。

标签: hibernate jboss second-level-cache


【解决方案1】:

先问几个问题:

  1. 此异常是否传播到您的应用程序?我的意思是,您是否受此影响,或者您只是关心日志中的消息?
  2. 您的所有实体是否都使用事务策略进行了注释,还是仅其中几个?
  3. 您的查询是否检索急切获取的另一个类的对象?

我会说你现在能做的最好的事情是为缓存操作启用调试(甚至可能是跟踪)日志记录:log4j.logger.org.hibernate.cache=debug 这将准确地告诉你 Hibernate 正在做什么。我怀疑 Hibernate 正在尝试将一个对象放入缓存,并在同一会话期间看到同一对象后再次执行此操作(可能是另一个对象树的一部分)。前段时间查询缓存有一个时间戳问题,这里可能会出现同样的问题。例如:

对象 A#1 -- 对象 B#1 对象 A#2 -- 对象 B#1

但是,在不知道问题是什么的情况下,很难预测解决方案是什么。而且恐怕只有 Hibernate 的日志才能告诉您真正的问题是什么。

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

【讨论】:

  • 感谢 cmets。在回答你的问题。 1)这会传播到应用程序并确实会导致一些问题。 2)所有可缓存的实体都以相同的方式注释,但只有一小部分实体是这样注释的。 3) 类上有一些@ManyToOne 关系会拉入其他缓存对象。我同意您的怀疑,即这可能会导致问题,因此我将根据您的建议进行日志记录更改,看看会发生什么。谢谢!
  • 我更改了缓存配置以使用 pessimistic-entity 而不是 mvcc-entity 并且错误消息消失了。测量结果表明缓存是一种改进,所以我暂时将其保留原样。我接受这个答案,因为关于休眠缓存调试跟踪的提示指出了我正确的方向
【解决方案2】:

您是否尝试过 CacheConcurrencyStrategy.NONSTRICT_READ_WRITE?我读了很多次文档,不知道该选择什么,但似乎对我的项目很有效。我猜 CacheConcurrencyStrategy.TRANSACTIONAL 太安全了,在某些情况下会避免缓存性能。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多