hibernate - 集群上的Hibernate L2缓存

标签 hibernate second-level-cache

Q1:
我对,只有这些供应商支持群集上的Hibernate L2缓存吗?

  • 休眠的Terracotta(商业)
  • SwarmCache(自2003年以来未发布)
  • JBoss缓存1.x
  • JBoss缓存2

  • Q2:
    Hibernate L2缓存是否有其他选择? (也许一些数据库缓存?)

    最佳答案

    Q1。 EhCache与分布式的Hibernate L2 Cache配合得很好。
    我们正在将其用于我们的项目。

    Q2。可能有几个缓存。

  • 所有数据库已经在内部进行了大量缓存,因此不必担心这部分。

  • 但是,数据库的问题
    缓存是它在物理上
    数据库服务器,因此每个查询
    涉及网络通话(延迟,
    bandwith ..)。这就是重点
    应用程序上的缓存数量
    服务器。


  • Hibernate L2缓存具有一些细节:
  • 非常易于使用(无代码,很少配置)
  • 从概念上讲是实体级别的(很细粒度,我们有时需要缓存更大的粒度,以减少数据库请求),
  • 通过id或collection工作(例如,默认情况下,不激活缓存查询结果,因为在一般情况下不可能使其有用)。


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

    还有其他我肯定...

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

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

    关于hibernate - 集群上的Hibernate L2缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1339684/

    相关文章:

    java - Java动态连接数据库(Spring Boot)

    java - JPA/hibernate : Map many-to-many relationship when join table has own primary key

    mysql - 在同一个 Web 应用程序中连接到多个 MYSQL DB

    nhibernate - 在这个例子中,为什么 nhibernate 不从缓存中检索?

    caching - overFlowToDisk何时在EHCACHE中被激活?

    java - Hibernate:错误无法在 JNDI 中找到 SessionFactory

    java - 与hibernate注解一对一关系

    java - hibernate 在二级缓存和各种缓存模式的数据库之间执行同步时?

    hibernate - WildFly 中的 JPA 共享缓存/二级缓存

    hibernate :batch_size?二级缓存?