【问题标题】:Hibernate second level cache - multiple objects of the same entityHibernate二级缓存——同一个实体的多个对象
【发布时间】:2020-03-26 23:51:38
【问题描述】:

我需要确保只创建同一实体的一个对象(就像使用一级休眠缓存加载数据时所做的那样,以简化实体刷新)并且我想使用二级缓存。

我正在测试 ehcache,但无法使其正常工作。通常,我的应用程序中的实体嵌套在其他实体中,但这只是一个简单的使用示例:

a) 使用一级缓存的示例,效果很好:

 session = HibernateUtil.getSessionFactory().openSession();
 transaction = session.getTransaction();
 transaction.begin();
 Person person=session.get(Person.class, 1L);
 Person person2=session.get(Person.class, 1L);
 transaction.commit();
 session.close();

 System.out.println(person2 == person);

它返回真

b) 在 Ehcache 中使用二级缓存

//1. load person with id 1
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.getTransaction();
transaction.begin();
Person person=session.get(Person.class, 1L);
transaction.commit();
session.close();

//2. load the same person
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.getTransaction();
transaction.begin();
Person person2=session.get(Person.class, 1L);
transaction.commit();
session.close();

System.out.println(person2 == person);

它返回错误

二级缓存是这样的正常行为还是我错过了什么? 任何二级缓存引擎是否只保留同一实体的一个实例(与一级缓存一样)?

【问题讨论】:

  • 看看here。我猜你的配置是错误的,但由于你没有发布,所以不可能告诉
  • 我仍然不确定它应该如何工作,它似乎就像我在数据库中更改某些内容并尝试刷新实体一样工作,它返回缓存值而不是数据库中的真实修改值但是.. . 我可以像在我的例子中那样做吗 person2 as object == person (避免数据库中同一实体/行的多个实例)

标签: java database hibernate caching


【解决方案1】:

这不可能在 Hibernate 中使用二级缓存将实体的一个实例保留在 RAM 中,因为每次 Hibernate 在缓存中找到它时,它只是根据缓存的数据创建新实例。

出于我的目的,我实现了基于 AVL 树的加载实体和数据库同步引擎,它根据从休眠中加载的实体创建存储库,并异步搜索实体中的所有字段并重写/合并所有相同的字段(这样如果有些字段(pk)与存储库中的实体相同,它会替换它)

通过这种方式与数据库同步很容易,因为它可以在存储库中找到外部更改的实体(基本上是在 O(log n) 的 AVL 树中)并重写其字段。

【讨论】:

    猜你喜欢
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2023-03-24
    • 2015-05-14
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多