Java と Hibernate の JPA 実装を使用してデータベース Web アプリケーションを構築しています。アプリケーションはオブジェクトを追跡します。また、レガシー ソースからオブジェクトをバッチ インポートする必要があります。
たとえば、人を追跡しているとしましょう。データベースには、Person および Address というテーブルがあります。対応する JPA エンティティと DAO クラスがあります。
JPAレイヤーの上には、さまざまな操作を担当するサービスレイヤーがあります。1 つの操作は、外部のレガシー ソース (電話帳の人など) から潜在的に大きなデータ セットをインポートすることです。人ごとに、データベースに既に存在するかどうかを確認する必要があります。次に、必要に応じて人物を作成または更新する必要があります。各人は住所を持っているため、適切な相互参照と住所の作成も行う必要があります。
私の問題は、この操作が大きなデータ セットに対して遅くなる可能性があることです。私の現在のアルゴリズムは次のとおりです。
for (Person person: allPersons)
{
check if person exists in database
check if address exists in database
create or update person and address as necessary
}
パフォーマンスを向上させるために何をお勧めしますか?
頭のてっぺんから次のことを考えることができます:
- クエリを使用してデータを取得し、データベースに保存するようにインポート ロジックを変更します。たとえば、人が for ループ内に存在するかどうかを確認する代わりに、すべての人のキーを 1 つのクエリでデータベースに送信します。各プロセスはメモリ内の人を取得します。
- DAO クラスに独自のキャッシュを追加します。
- 外部キャッシュ ソリューション (memcached など) を使用します。
クエリを最小限に抑えるために再構築することで、常に#1を使用できます。欠点は、サービス層が DAO 層を非常に認識していることです。その実装は、下位のデータベース層によって決定されるようになりました。メモリの使用量が多すぎるなどの問題もあります。このデータベースから取得してからメモリ内で処理する方法は、非常に自家製のようであり、JPA のような市販のソリューションに反します。この場合、他の人がどうするか興味があります。
編集:ループ内でクエリされる各人が異なるため、キャッシュは役に立ちません。