是否可以在同一个Gemfire Region上存储两个bean对象?

时间:2016-07-29 07:24:41

标签: spring spring-boot gemfire spring-data-gemfire geode

我们正在尝试制作两个Gemfire存储库,因为它们正在处理两个不同的bean对象,但我们希望将这两个bean对象存储到同一个gemfire区域。

这是一种正确的方法吗? 如果“是”那么如何做?

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

...我们希望将这两个bean对象存储到同一个gemfire区域。这是一个正确的方法吗?

这是值得商榷的。但是,它实际上取决于您的应用程序要求和用例。它还取决于对象之间的关系。

例如,如果您有一个Customer扩展(is-a)Person,那么将CustomersPeople存储在同一个区域可能看起来不是全部坏。

但是,如果您要存储Customers并说Purchases,其中CustomerPurchases组成,或者“有一个”ClassCastExceptions的设置/列表,那么这很难消化。它还使得查询此区域变得更加棘手,因为(OQL)查询引擎会检查属性/字段的对象类型信息,甚至是在查询中调用的方法调用,这可能会导致NoSuch[Method|Field]Exceptions@Region 。所以,要小心。

在这方面,我倾向于更多的纯粹主义者,并建议/建议您将应用程序域模型对象保留在不同的区域中,尤其是在“has-a”关系的情况下。可以将数据存储在单独的区域中并仍然“并置”数据(即区域),特别是出于查询目的。有关详细信息,请参阅here

但是...

所有这一切并不是说你无法在同一个区域内存储类似甚至不同类型的对象。

通常,您使用@Region("Customers") class Customer extends Person { ... } @Region("Purchases") class Purchase { ... } 注释来注释您的业务,应用程序域对象,以指定对象将存储在哪个GemFire缓存区域中,如此...

interface CustomerRepository extends GemfireRepository<Customer, Long> { .. }

interface PurchaseRepository extends GemfireRepository<Purchase, Long> { .. }

然后你继续定义你的存储库...

Customer

通常情况下,当SD Commons Repository基础架构和SD GemFire的Repository扩展检测到Repository接口时,它会检查类型参数,查看应用程序域对象(即Purchase&amp; @Region),检查那些和确定每个应用程序域对象所属的区域...

  1. 检测并检查Customer注释属性值,或..

  2. 使用域对象类名的“简单”名称作为区域名称(即Customer域对象的“客户”区域)。

  3. 确定区域。

    但是,如果您希望将Purchase@Region对象存储在SAME区域中,则SD GemFire会扩展通用存储库基础结构,并允许您使用{{1来注释存储库接口注释,就像这样......

    @Region("Customers")
    interface CustomerRepository extends GemfireRepository<Customer, Long> { .. }
    
    @Region("Customers")
    interface PurchaseRepository extends GemfireRepository<Purchase, Long> { .. }
    

    在这种情况下,CustomerPurchase对象都将存储在“Customers”区域中,因为存储库接口上的@Region注释覆盖各个应用程序域对象的@Region注释。

    有正当理由和用例在Spring Data GemFire中特别允许此功能。要了解有关此问题的更多信息,请阅读here

    无论采取何种方法,您都应该仔细权衡您的选择。

    希望这有帮助!

    干杯, 约翰