集群中的Hibernate L2缓存

3

问题1: 我是否正确,只有这些供应商支持在集群上使用Hibernate L2缓存?

  • Terracotta for Hibernate(商业版)
  • SwarmCache(自2003年以来未发布)
  • JBoss Cache 1.x
  • JBoss Cache 2

问题2: 除了Hibernate L2缓存,还有其他替代方案吗?(也许是一些数据库缓存?)


Terracotta是OSS,与JBoss相同,不确定为什么您将其列为商业产品。 - Taylor Gautier
4个回答

10
Q1. EhCache可以很好地作为分布式的Hibernate L2缓存,我们正在项目中使用。
Q2. 可以使用多个缓存。
  • 所有数据库都已经在内部做了很多缓存,所以不用担心这一点。

然而,数据库缓存的问题在于它实际上位于数据库服务器上,因此每次查询都涉及到一个网络调用(延迟、带宽等)。这就是应用服务器上缓存的全部意义。


  • Hibernate L2缓存具有一些特点:
    • 非常易于使用(无需编写代码,配置较少)
    • 概念上处于实体级别(这相当精细,有时需要缓存更大的颗粒度,以减少数据库请求),
    • 按ID或集合工作(例如,默认情况下禁用缓存查询结果,因为无法在一般情况下使其有用)。

  • 当Hibernate L2不适用时,我们使用同样的EhCache库来缓存数据(这不是实体)。使用案例的示例:
    • 当表格很大(记录长度和数量)时,内存使用情况不允许完全缓存它,但仅为所有记录缓存三个字段是可以的。可能是因为这些字段经常被访问或不可变...
    • 当我们对缓存进行许多读取访问,并且每个访问都会触发一个计算(在L2缓存上)给定我们拥有的实体:计算结果可以存储在缓存中。(典型例子是计算需要来自其他表的细节,但是这些细节在最终结果中没有使用,因此缓存不会存储这些细节)
    • 当表中的实体按类别逻辑分组时,我们想一次请求和缓存一个类别,而不是常规的L2缓存策略,即逐个实体。

在分布式环境中,通常这些

在我们修改实体的时候,这将导致一个分类无效化,对于我们来说是功能上合理的(对于性能至关重要,否则我们就必须使所有这些实体无效;这是因为缓存无效化整个区域或特定对象,但中间需要循环,这对性能不利)。

当然还有其他的问题...

因此,这种情况与数据库关系不密切,它通常不会存储我们的Hibernate实体。我们将其放置在业务层(而不是数据访问或Daos)中,并直接提供给业务代码。请注意,对于我们来说,它不是一个透明的缓存,而是一个显式业务服务的调用(负责该缓存:如果数据不存在,则加载它,根据需要进行失效处理),执行操作或提供值。

这个缓存中有趣的线程问题:因为这个缓存被我们数百个Web线程访问,所以它需要支持多线程。您可能知道为什么线程安全值要么是不变的,要么在每次调用时克隆(这经常是性能问题)。因此,我们所有的业务缓存都使用不可变对象,而且性能非常好。


2

1

EhCache有分布式模式,但我不确定它是否与Hibernate兼容。虽然我不知道为什么它不能工作。

您有没有因某些特定原因省略JBossCache 3?


不,我只是不知道而已 =)。谢谢。 - Yury Litvinov

0

hibernate-redis 库是一个完美的选择。它是基于 Redis 的缓存。

为什么选择 Redis?因为它非常快速,可以在云端工作,并且有像AWS Elasticache这样的云解决方案,所以您不需要自己管理它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接