2 つの Gemfire リポジトリを作成しようとしています。2 つの異なる Bean オブジェクトを扱っているためですが、これら 2 つの Bean オブジェクトを同じ gemfire リージョンに格納したいと考えています。
これは正しい方法ですか?「はい」の場合、どうすればよいですか?
前もって感謝します。
2 つの Gemfire リポジトリを作成しようとしています。2 つの異なる Bean オブジェクトを扱っているためですが、これら 2 つの Bean オブジェクトを同じ gemfire リージョンに格納したいと考えています。
これは正しい方法ですか?「はい」の場合、どうすればよいですか?
前もって感謝します。
...これら 2 つの Bean オブジェクトを同じ gemfire リージョンに格納します。これは正しい方法ですか?
それは議論の余地があります。ただし、実際にはアプリケーションの要件とユース ケースによって異なります。また、オブジェクト間の関係にも依存します。
たとえば、Customer
拡張する (is-a) があるPerson
場合、両方Customers
をPeople
同じリージョンに格納することはそれほど悪くないように思えるかもしれません。
しかし、もしあなたが保存Customers
していてPurchases
、どこで aCustomer
が構成されているか、または のセット/リストを「持っている」と言うとPurchases
、それは消化するのが難しくなります。また、(OQL) クエリ エンジンはプロパティ/フィールドのオブジェクト タイプ情報を検査し、クエリ内で呼び出された場合はメソッド呼び出しも検査するため、このリージョンのクエリはより複雑にClassCastExceptions
なりNoSuch[Method|Field]Exceptions
ます。ので注意してください。
私はこの点に関してより純粋主義者になる傾向があり、特に「has-a」関係の場合は、アプリケーション ドメイン モデル オブジェクトを別々のリージョンに保持することを提案/推奨します。データを別々のリージョンに保存し、特にクエリの目的で、データ (つまり、リージョン) を「併置」することができます。詳しくはこちらをご覧ください。
しかし...
これはすべて、同じリージョンに同様の、または異なるタイプのオブジェクトを格納できないと言っているわけではありません。
通常、ビジネス、アプリケーション ドメイン オブジェクトに@Region
アノテーションを付けて、オブジェクトが格納される GemFire キャッシュ リージョンを指定します。
@Region("Customers")
class Customer extends Person { ... }
@Region("Purchases")
class Purchase { ... }
次に、リポジトリを定義します...
interface CustomerRepository extends GemfireRepository<Customer, Long> { .. }
interface PurchaseRepository extends GemfireRepository<Purchase, Long> { .. }
通常、SD Commons Repository インフラストラクチャと SD GemFire の Repository 拡張機能が Repository インターフェースを検出すると、タイプ パラメータを検査し、アプリケーション ドメイン オブジェクト (つまりCustomer
& Purchase
) を確認し、それらを検査して、各アプリケーション ドメイン オブジェクトが属するリージョンを決定します...
@Region
アノテーション属性値を検出して検査するか、または..
ドメイン オブジェクト クラス名の「単純な」名前をリージョン名として使用します (つまり、Customer
ドメイン オブジェクトの「顧客」リージョン)。
それが地域を決定します。
ただし、Customer
とPurchase
オブジェクトの両方を同じリージョンに保存する場合、SD GemFire は共通のリポジトリ インフラストラクチャを拡張し、リポジトリ インターフェイスに注釈を付けることを可能にします@Region
。
@Region("Customers")
interface CustomerRepository extends GemfireRepository<Customer, Long> { .. }
@Region("Customers")
interface PurchaseRepository extends GemfireRepository<Purchase, Long> { .. }
この場合、リポジトリ インターフェイスのアノテーションが個々のアプリケーション ドメイン オブジェクトのアノテーションをオーバーライドCustomer
するため、とPurchase
オブジェクトの両方が「Customers」リージョンに格納されます。@Region
@Region
特に Spring Data GemFire でこの機能を許可する正当な理由とユースケースがありました。詳細については、こちらをお読みください。
どのようなアプローチを取る場合でも、選択肢を慎重に検討する必要があります。
お役に立てれば!
乾杯、ジョン