共享 nHibernate 和 hibernate 二级缓存

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

这听起来可行,但是:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

例子:

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

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

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

【讨论】:

以上是关于共享 nHibernate 和 hibernate 二级缓存的主要内容,如果未能解决你的问题,请参考以下文章

Nhibernate/Hibernate、查找表和对象设计

Hibernate/NHibernate 映射规则

NHibernate 是不是与 Hibernate 互操作?如果没有,是不是有适用于 Java 和 .NET 的框架?

相当于NHibernate中Hibernate的@embeddable/EF的ComplexTypeConfiguration?

使用 NHibernate/Hibernate 将实体类型转换为子类型

NHibernate 和共享网络托管