【问题标题】:Update 2nd Level Cache instead of Invalidating更新二级缓存而不是失效
【发布时间】:2017-01-24 09:04:54
【问题描述】:

我们使用 Hibernate 3.5.6 和 Hazelcast 3.6.1 作为二级缓存。我们有以下问题。我们有一个带有非惰性集合的 Hibernate 实体。在同一节点上的两个连续会话中向集合添加元素时,始终从数据库重新加载整个集合。我本来希望在将元素添加到集合时可以更新二级缓存,而不是完全将其从缓存中逐出并每次重新加载以添加另一个条目。这是 Hibernate 二级缓存的原理问题,还是我们这边的配置问题?

【问题讨论】:

  • 这可能与缓存的容量有关。你检查过吗?
  • ... 00 LRU500025100 ...
  • 我相应地更改了配置,但并没有改变行为

标签: hibernate hazelcast


【解决方案1】:

hibernate 缓存,默认是 PK 键的,所以当你执行 findAll() 时,它不会使用 hibernate 缓存,当你执行 findOne(id) 时它会。

如果你想缓存 findAll() 我会使用 ehcache 和 @Cache 注释,请注意它用于缓存的键。见http://www.ehcache.org/documentation/2.8/get-started/key-classes-methods.html

【讨论】:

  • 我们遇到的问题是我们想向集合中添加一个元素。 Hibernate 将始终加载整个集合以向其中添加元素。现在的问题是,如果无法从二级缓存加载集合(在我们的例子中我不明白),它将始终查询数据库以加载整个集合。
  • @JanSchaefer 正确,您必须自己扮演此缓存的角色。我很高兴被证明是错误的,但我已经多次遇到与您完全相同的问题。
【解决方案2】:

我想我可以自己回答这个问题。事实上,Hibernate不会更新集合,但总是使其无效。我在这里找到了以下解释:http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache:

什么是缓存语义?嗯,关键是缓存中的集合永远不会更新;它们只会在缓存中失效,然后可能会在稍后作为另一个数据库读取的结果再次缓存。因此,如果应用程序调用 Group.addMember(),Hibernate 将从缓存中删除该组的成员资格集合。如果 JBoss Cache 是二级缓存实现,那么该删除将在集群中传播;该集合将从集群中所有节点的缓存中删除。

如果稍后应用程序需要访问该组中的成员,则会发生另一次数据库读取,并将成员的当前主键集放入缓存中。

【讨论】:

    猜你喜欢
    • 2017-06-01
    • 2011-08-31
    • 1970-01-01
    • 2013-10-03
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多