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

标签 java hibernate second-level-cache

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

但是,hibernate 如何确保二级缓存与数据库中的数据保持同步。

例如:

假设以下类是实体并持久化到数据库中。

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

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

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

一般来说,hibernate是如何保证二级缓存中的数据与db值一致的。

感谢您的帮助。

最佳答案

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

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

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

如果您使用 EhCache 缓存提供程序,您可以提供这样的配置:

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

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

但是有很多关于此的有用教程。

关于java - hibernate 如何确保二级缓存使用数据库中的最新数据进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30413321/

相关文章:

AspectJ:如何选择给定类的子类的非注释方法的执行?

java - 如何使用 j8583 库将 ISO8583 消息长度添加到 ISO8583 消息中

java - 设置 Layered Drawable 的大小?

java - 找不到 hibernate.cfg.xml - java 中的异常

java - 如何获取android主类的实例?

Java 1.8 Maven + Hibernate + MySQL 示例(XML 映射)

java - Hibernate - OutOfMemoryError - java 堆大小

java - Hibernate 查询缓存处于 Activity 状态时 Wildfly 无法启动

java - 使用 Hibernate 二级缓存和 Multi-Tenancy

hibernate - 使用 Hibernate + Spring 缓存 - 一些问题