【发布时间】: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