Hibernate 在群集上休眠二级缓存

Hibernate 在群集上休眠二级缓存,hibernate,second-level-cache,Hibernate,Second Level Cache,问题1: 只有这些供应商支持集群上的Hibernate二级缓存,这对吗 冬眠用陶土(商业) SwarmCache(自2003年以来未发布) JBoss缓存1.x JBoss缓存2 问题2: 是否有其他方法可以替代Hibernate二级缓存?(可能是一些数据库缓存?EhCache有一种分布式模式,但我不确定Hibernate是否支持这种模式。不过,我不明白为什么它不起作用 您是否出于某种特定原因省略了JBossCache 3?Q1。EhCache与Hibernate二级缓存(分布式)一样工作良

问题1: 只有这些供应商支持集群上的Hibernate二级缓存,这对吗

  • 冬眠用陶土(商业)
  • SwarmCache(自2003年以来未发布)
  • JBoss缓存1.x
  • JBoss缓存2
问题2:
是否有其他方法可以替代Hibernate二级缓存?(可能是一些数据库缓存?

EhCache有一种分布式模式,但我不确定Hibernate是否支持这种模式。不过,我不明白为什么它不起作用


您是否出于某种特定原因省略了JBossCache 3?

Q1。EhCache与Hibernate二级缓存(分布式)一样工作良好。 我们正在将此用于我们的项目


问题2。可以使用多个缓存

  • 所有数据库都已经在内部进行了大量缓存,所以不用担心这一部分
但是,数据库的问题 缓存是指它物理上位于 数据库服务器,所以每个查询 涉及网络呼叫(延迟, 带着……)。这就是重点 应用程序上缓存的名称 服务器


  • Hibernate二级缓存有一些细节:
    • 非常易于使用(无代码,配置很少)
    • 从概念上讲,在实体级别(非常细粒度,我们有时需要缓存更大的粒度,以生成更少的数据库请求)
    • 按id或集合工作(例如,缓存查询结果在默认情况下处于禁用状态,因为在一般情况下不可能使其有用)

  • 当Hibernate L2不合适时,我们使用相同的EhCache库来缓存数据(不完全是实体)。用例示例:
    • 当一个表很大(记录长度和数字)时,内存使用不允许完全缓存它,但只为所有记录缓存三个字段是可以的。可能是这些字段是经常访问的字段,或者是不可变的
    • 当我们对缓存有多个读取访问时,每个访问都会触发一个计算(在二级缓存上),给定我们拥有的实体:计算结果可以存储在缓存中。(典型示例,计算需要来自其他表的详细信息,但最终结果中未使用这些详细信息,因此缓存不存储这些详细信息)
    • 当表中的实体按类别进行逻辑分组时,我们希望一次请求和缓存一个类别,而不是一次一个实体的常规二级缓存策略
在分布式环境中,这通常 转化为使一个 当其中一个 实体被修改,这是功能性的 对我们来说是合乎逻辑的(对我们来说是必要的) 性能,否则我们会 必须使所有这些无效 实体;这是因为缓存 使整个区域或区域无效 特定对象,但在 (必须循环,这对性能不利)

还有其他我相信

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

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


您还可以使用[Infinispan(JBoss缓存的演进)作为二级缓存提供程序!][1]

[1] :参见lib将是完美的选择。这是一个基于Redis的缓存


为什么是Redis?它的速度非常快,可以在云中工作,并且有现成的云解决方案,例如,所以您不需要自己管理它。

不,我只是不知道它=)。谢谢。Terracotta是和JBoss一样的OSS。我不知道你为什么列为商业版