【问题标题】:Ehcache / Hibernate and RMI replication with large number of entities具有大量实体的 Ehcache / Hibernate 和 RMI 复制
【发布时间】:2010-10-08 15:39:14
【问题描述】:

我目前正在研究如何在 ehcache 中使用 RMI 分发选项。我已经正确配置了 ehcache.xml 并且复制似乎工作正常。但是我有两个问题:

-> ehcache/hibernate 似乎为每个实体创建 1 个缓存。这很好,但是当复制到位时,它会创建 1 个线程/缓存来复制。这是预期的行为吗?由于我们的域很大,它创建了大约 300 个线程,在我看来这真的很大

-> 另一个令人讨厌的后果是心跳消息似乎聚合了所有这些缓存名称。从我看到的消息应该适合 1500 字节,但它不适合,这导致我的日志中出现这条消息:心跳不工作。为复制配置更少的缓存。大小为 1747 但不应大于 1500。关于如何改变的任何想法?

非常感谢您的帮助

【问题讨论】:

    标签: java hibernate replication ehcache


    【解决方案1】:

    我们已经有了一个 hack,我们拥有自己的 hibernate EhCacheProvider 的自定义副本,它覆盖 buildCache() 以创建我们自己的具有缩短名称(名称的哈希)的 Cache 对象。这达到了 1500 的限制。我们保留原始名称的哈希图和哈希名称以进行反向查找。

    我们不久前就这样做了,并且一直在生产中使用它。

    我们还查看了您的另一个问题,即只有一个复制器线程。首先,我们复制了 RMICacheReplicatorFactory 并更改了 createCacheEventListener() 以返回我们通过将 replicationThread 字段设为静态然后对其进行必要修复来修改的 RMIAsynchronousCacheReplicator 副本。我们没有彻底测试它或将其投入生产,但正在再次查看它,这就是我找到这篇文章的方式:)

    【讨论】:

    【解决方案2】:

    您是否考虑过将 JBossCache 作为 EHcache 的替代品? JBossCache 具有分布式事务,并且经过良好的高负载测试。它具有较低级别的复制机制,可以让您使用 UDP 或 TCP 多播/广播复制。

    【讨论】:

      【解决方案3】:

      您是否考虑过 EHCache 而不是 Terracotta?看看Terracotta Hibernate Integration Terracotta EHCache Integration

      重要的是,Terracotta 分布式 EHCache 是一致的 - 所有节点都具有相同的缓存视图。这对于我使用的其中一个应用程序非常重要。

      看看。它对我们来说就像一种魅力。

      /RS

      【讨论】:

        【解决方案4】:

        顺便说一句,ehcache-core 的 Ehcache 1.7.1 版本已经解决了 1500 字节的限制。见EHC-424

        【讨论】:

          【解决方案5】:

          jms 复制是一种选择吗?

          (我一直在考虑将它与异步行为一起使用,它工作得很好。文档有误,所以我不得不检查源代码以查看正确配置它所需的实际属性。jms 的好处是,如果你设置好该基础架构后,您无需配置任何防火墙等即可让它通过。)

          【讨论】:

          • JMS 远不是实时的,任何更新缓存的传输都必须是实时的。
          • 如果您只是设置了一个默认缓存,那么它将被克隆以创建每个必要的实体缓存。 AFAIK,你不会得到“一个大缓存”。
          猜你喜欢
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-26
          • 1970-01-01
          • 1970-01-01
          • 2013-10-02
          • 1970-01-01
          相关资源
          最近更新 更多