【问题标题】:Sharing nHibernate and hibernate 2nd level cache共享 nHibernate 和 hibernate 二级缓存
【发布时间】:2010-07-13 16:26:47
【问题描述】:

是否可以在休眠和休眠解决方案之间共享二级缓存?我有一个环境,其中有运行 .net 的服务器和运行 java 的服务器都访问同一个数据库。

他们访问的数据有一些重叠,因此共享二级缓存是可取的。有可能吗?

如果这不可能,其他人提出了哪些解决方案?

【问题讨论】:

    标签: java .net nhibernate hibernate orm


    【解决方案1】:

    他们访问的数据有一些重叠,因此共享二级缓存是可取的。有可能吗?

    这需要(这很可能过于简单化了):

    1. 能够从 Java 和 .Net 访问缓存。
    2. 为 (N)Hibernate 提供缓存提供程序实现。
    3. 能够以与两种语言兼容的格式读取/写入数据(或者没有必要互化缓存)。

    这听起来可行,但是:

    • 我不知道现有的即用型解决方案可以实现这一点(我的第一个想法是 Memcache,但 AFAIK Memcache 存储数据的序列化版本,因此这不符合最重要的要求 #3 )。
    • 我想知道是否使用语言中性格式来存储数据不会产生太多开销(并且以某种方式破坏了使用缓存的目的)。

    如果这不可能,其他人提出了哪些解决方案?

    我从来没有这样做过,但是如果我们谈论的是读写缓存,并且如果您使用两个单独的缓存,您将不得不从 .Net 端使给定的 Java 缓存区域无效,反之亦然。您必须编写代码来处理它。

    【讨论】:

      【解决方案2】:

      正如 Pascal 所说,共享第二个缓存在技术上是不可能的。

      但是,您可以从不同的角度考虑这一点。

      两个应用程序不太可能读取和写入相同的数据。因此,您可以实现缓存失效服务(使用您选择的通信堆栈),而不是共享缓存。

      例子:

      • 应用程序 A 主要读取 Customer 数据并写入 Invoice 数据
      • 应用程序 B 主要读取 Invoice 数据并写入 Customer 数据
      • 因此,应用程序 A 缓存 Customer 数据,应用程序 B 缓存 Invoice 数据

      例如,当应用程序 A 修改发票时,它会向应用程序 B 发送一条消息,并告诉它从缓存中删除发票。

      您还可以逐出整个实体类型、集合和区域。

      【讨论】: