Java オブジェクトのセットを返す別のシステム上のインターフェースを呼び出して「粗い検索」を実行するシステムがあります。検索結果を受け取ったら、属性の状態を表す特定の基準に基づいて、結果の Java オブジェクトをさらにフィルタリングできるようにする必要があります (たとえば、最初のオブジェクトから xy > z && ab == c のすべてのオブジェクトを返します)。
毎回オブジェクトのセットをフィルタリングするために使用される基準は、部分的にユーザーが構成可能です。つまり、ユーザーは一致する値と範囲を選択できますが、選択できる属性は固定セットになります。
データ セットには、検索ごとに <= 10,000 オブジェクトが含まれる可能性があります。検索は、おそらく 1 日に 2000 回以下 (約)、アプリケーション ユーザー ベースによって手動で実行されます。結果セット内のすべてのオブジェクトは、構造と関係を記述する Hibernate および JPA アノテーションを持つ既知のドメイン オブジェクト クラスであることは、おそらく言及する価値があります。
可能な解決策
頭のてっぺんから、これを行う3つの方法を考えることができます。
- 検索ごとに、最初の結果セット オブジェクトをデータベースに保持し、Hibernate を使用して、より細かい基準を使用してそれらを再クエリします。
- メモリ内データベース (hsqldb など) を使用して、最初の結果セットをクエリおよび調整します。
- 最初の結果セットを反復処理して目的のレコードを引き出すカスタム コードを記述します。
オプション1
オプション 1 では、ネットワークを介して物理データベース (Oracle 10g) に至るまでの往復が多く、ネットワークとディスクのアクティビティが多くなる可能性があります。また、異なる検索が互いに干渉しないようにするために、各検索の結果を他の結果セットから分離する必要があります。
オプション 2
オプション 2 は、メモリ内でより細かいクエリを実行でき、検索が完了した後にのみ破棄される結果データの永続性を必要としないため、原則として良い考えのようです。直感的には、これもかなりパフォーマンスが高い可能性がありますが、メモリ オーバーヘッドが大きくなる可能性があります (これは、JVM が取得するメモリの量にかなり柔軟に対応できるため、問題ありません)。
オプション 3
オプション 3 は非常にパフォーマンスが高い可能性がありますが、作成するコードには非常に慎重なテストが必要であり、柔軟で堅牢なものを実現するのに時間がかかる可能性があるため、避けたいものです。
3 つのアイデアすべてのプロトタイプを作成する時間がないため、上記の 3 つのオプションに関するコメントと、私が検討していないその他のアイデアを探して、どのアイデアが最も適しているかを判断するのに役立てたいと考えています。私は現在、オプション 2 (メモリ内データベース) に傾倒しているので、メモリ内で POJO をクエリした経験のある人からの連絡もお待ちしています。
状況を十分に詳しく説明できれば幸いですが、シナリオをよりよく理解するためにさらに情報が必要な場合は、遠慮なくお尋ねください。
乾杯、
エド