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

这是基于我的理解 文档.

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

“交易试图重新创建myclass。自此交易启动以来,它已经由另一个(可能是远程)事务创建。我们有一个并发创作事件”

接下来是一个巨大的堆栈跟踪,它最终追溯到我所做的命名查询,其形式如下:

SELECT x FROM X WHERE x.deleted = false

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

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

有帮助吗?

解决方案

先提几个问题:

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

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

Object A#1
 -- Object B#1

Object A#2
 -- Object B#1

但同样,如果不知道问题是什么,就很难预测解决方案是什么。而且恐怕只有 Hibernate 的日志才能告诉你到底是什么问题。

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

其他提示

你试过CacheConcurrencyStrategy.NONSTRICT_READ_WRITE?我阅读文档了很多次,不知道该选正是,但似乎做工精细为我的项目。我猜CacheConcurrencyStrategy.TRANSACTIONAL太多的安全,避免在某些情况下缓存性能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top