当前位置: 首页 > 知识库问答 >
问题:

hibernate如何确保二级缓存使用数据库中的最新数据进行更新

长孙正卿
2023-03-14

我已经读到,使用hibernate的二级缓存,它可以通过减少数据/对象检索的数据库命中来提高应用程序的性能。

然而,hibernate如何确保二级缓存和数据库中的数据是最新的。

例如:

假设下面的类是entity并持久化到DB中。

@Entity
class User {
    Id
    private int id;
    private String str;
}

现在,如果我们启用了二级缓存,我知道如果我们打开不同的会话,那么每个会话都将命中二级缓存以检索对象值。

现在,如果数据库中的数据发生更改(例如,对于id=1的行),例如通过一些独立的进程/手动更改值,并且我们尝试访问该值,hibernate如何检测缓存具有最新的值(对于id=1)。

通常,hibernate如何确保二级缓存中的数据和db值一致。

谢谢你的帮助。

共有2个答案

竺捷
2023-03-14

它没有。

如果您在不使用hibernate的情况下更改数据库中的数据,它将不知道该数据,并且您的缓存和数据库将不同步。

端木兴国
2023-03-14

Hibernate自己管理缓存,因此当您通过hibernate会话更新某些实体时,它会使与该实体关联的缓存条目无效-因此缓存始终是新鲜的。

如果另一个进程(甚至运行同一hibernate应用程序的第二个JVM)更新数据库中的记录,则第一个JVM上的hibernate不知道这一事实,并且在其缓存中有过时的对象。

但是,您可以使用所需的任何缓存实现(缓存提供程序)。有许多生产就绪缓存提供程序允许您配置给定实体在缓存中存储的时间。例如,您可以将缓存配置为在30秒后使所有实体无效,依此类推。

如果使用EhCache缓存提供程序,则可以提供以下配置:

<cache name="com.my.company.Entity" 
   maxElementsInMemory="1000" 
   eternal="false" 
   timeToIdleSeconds="7200" 
   timeToLiveSeconds="7200" 
   overflowToDisk="false" 
   memoryStoreEvictionPolicy="LRU"/>

您可以在此处找到有关NT二级缓存的更多信息:http://www.tutorialspoint.com/hibernate/hibernate_caching.htm

然而,有很多关于这方面的有用教程。

 类似资料:
  • 问题内容: 我已经读到,使用hibernate的二级缓存,它可以通过减少对数据/对象检索的数据库命中次数来提高应用程序性能。 但是,hibernate如何确保二级缓存与数据库中的数据保持最新。 例如: 假设下面的类是实体并且持久化到数据库中。 现在,如果我们启用了二级缓存,我知道如果打开不同的会话,则每个会话都将命中二级缓存以获取对象值。 现在,如果数据库中的数据发生更改(例如,对于ID = 1的

  • 问题内容: 不久,我将一个实体映射为在启用了二级缓存(只读策略)的数据库(Oracle)中查看-ehcache。 如果我手动更新数据库中的某些列,则不会更新缓存。 我没有找到任何方法可以做到这一点。仅当更新将通过Hibernate实体完成时。 我可以以某种方式实现此功能吗? 也许乔布监视表(或视图)?或者也许有某种方法可以通知Hibernate有关具体表中数据库的更改。 感谢您将来的回答! 问题答

  • 所以,我的程序中有公司和员工实体。雇员为公司工作,在雇员表中有company_id(外键),我跟踪某些雇员为哪个公司工作。现在,如果我想更新该字段,如何更改公司员工正在工作? 我想更新员工类中的company_id,使用字段int companyId来引用该列,但是它不起作用。在员工服务实施中。类如果我想更新该列(这意味着员工不是为公司工作,或员工更改了公司),我必须调用公司类,这不是我想在员工表

  • 问题内容: update 我可以创建我的数据库架构,它会自动添加属性,约束,键等。但是,更新数据库架构又如何呢?如果我从实体中删除了某些属性,hibernate则不会删除它,或者如果我更改了某些约束,则hibernate不会触及已经创建的约束… 那么,有没有一种方法可以使hibernate状态真正更新数据库架构? 谢谢。 问题答案: 我们为自己创建了一个工具,该工具创建了必要的数据库列和表,并将其

  • 这就是我的设想。我有一个POJO类,我们称之为Car,声明如下: 在那个类中,列表 图片应该包含到我实际上传图片的Firebase存储的链接。由于Firebase函数的异步根,我在这方面遇到了问题。在第一个时刻,pictures列表具有图像的本地路径,因为我不希望用户在完成向Firebase数据库添加记录所需的所有步骤之前上传任何内容。所以,我只保存图像的本地路径。但是,一旦数据保存到云中,我当然

  • 我正在实现一个基于实体属性值的持久化机制。所有数据库访问都是通过Hibernate完成的。我有一个包含节点路径的表,它非常简单,只有一个id和一个路径(字符串)。路径数量很少,大约几千条。 主表有数百万行,我没有重复路径,而是将路径规范化为它们自己的表。以下是我在插入主表时想要的行为 1)检查路径表中是否存在路径(通过实体管理器查询,使用路径值作为参数) 2) 如果不存在,则插入并获取id(通过实