java - 为什么 Hibernate 会尝试访问 "cache",这在集群环境中如何工作?

标签 java hibernate caching jakarta-ee cluster-computing

假设您有一个 4 节点 J2EE 应用程序服务器集群,所有运行的 Hibernate 应用程序实例。缓存在这种情况下如何工作?它有什么好处吗?是否应该将其关闭?

在我看来,一个特定节点上的数据会很快变得陈旧,因为其他用户访问其他节点会对数据库数据进行更改。在这种情况下,Hibernate 如何相信它的缓存是最新的?

最佳答案

首先,你应该弄清楚你在说什么缓存,Hibernate 有 3 个缓存(一级缓存又名 session 缓存,二级缓存又名全局缓存和依赖于第二级的查询缓存级缓存)。我想问题是关于二级缓存的,所以这就是我要介绍的内容。

How does caching work in this situation?

如果要缓存只读数据,没有什么特别的问题。 如果你想缓存读/写数据,你需要一个集群安全的缓存实现(通过失效或复制)。

Does it do any good at all?

这取决于很多事情:缓存实现、更新频率、缓存区域的粒度等。

Should it simply be turned off?

二级缓存实际上是默认禁用的。 如果您想使用它,请打开它。

It seems to me that data on one particular node would become stale quickly as other users hitting other nodes make changes to database data.

这就是您需要集群安全缓存实现的原因。

In such a situation, how could Hibernate ever trust that its cache is up to date?

简单:Hibernate 信任缓存实现,它必须提供一种机制来保证给定节点的缓存不会过时。最常见的机制是 synchronous invalidation :当一个实体被更新时,更新后的缓存会向集群的其他成员发送通知,告诉他们该实体已被修改。收到此消息后,其他节点将从其本地缓存中删除此数据(如果该数据存储在那里)。

关于java - 为什么 Hibernate 会尝试访问 "cache",这在集群环境中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3794664/

相关文章:

java - 是否可以逐出spring缓存部分数据?

sql-server - 如何清除 SQL Server 查询缓存?

java - 锁可中断与锁

java - 更快地将通过 HTTP 接收的数据存储到数据库(或文件系统)中

java - Hibernate 错误在@PostPersist 方法中保留一个实体

javascript - 缓存动态加载的图像

java - 不使用第 3 方库(核心 Java)从 HTTP 请求字符串解析 HTTP header 的最佳方法

java - 输出流的内容长度

java - apache-commons-config PropertiesConfiguration : comments after last property is lost

java - 在联结表中使用复合主键时,Hibernate 未正确映射对象 ("Bad value for type"异常)