0

アプリケーションがユーザーに提供するコピー機能のパフォーマンスの問題に苦しんでいます。私はそれについて正しい方法で行っているかどうかわかりません。Hibernate の経験はあまりありません。

過度に単純化されたレイアウトは次のようになります。

Project ---> (One to Many) Items ---> (One to Many) Tasks
Project ---> (One to Many) Variables
Items <---> Variables (Many to Many)

したがって、プロジェクトには多くのアイテムを含めることができ、各アイテムには多くのタスクを含めることができます。プロジェクトには変数を含めることができ (重複なし)、アイテムと変数の間には多対多があります (それらは互いに関連付けられています)。

プロジェクトごとに数百の項目があり、項目ごとにいくつか (20 ~ 30) のタスクがあり、プロジェクトごとに数百の変数がある場合があります。プロジェクト間でコピーしたいアイテムやタスクを確認できる機能を追加しました。重複はあり得ません。

チェックされた各項目に対して実行するプロセスは次のとおりです。

  1. アイテムがターゲット プロジェクトに存在するかどうかを確認し、存在する場合は追加し、存在しない場合は追加しません。session.createFilter を使用して、ターゲット プロジェクトを (アイテム名で) クエリしました。アイテムが存在しない場合は、追加します。( object.save())、ターゲット プロジェクトのアイテム コレクションに追加します。
  2. アイテムに変数が関連付けられている場合は、ターゲット プロジェクトでそれらの変数を確認し (再度session.createFilter())、変数が存在しない場合は追加し、item.variables コレクションに追加します。

これをスピードアップするために何ができるかわかりません。最初にすべてのチェックを行っても問題は解決しないと思います。ターゲット プロジェクトにアイテム/変数が存在することを確認するのに createFilter が最適な方法であるかどうかはわかりません。

オブジェクトをコレクションに追加する方法を変更しようとしました。一度に 1 つずつ追加します ( targetProject.add(item))。今はそれらを arraylist に格納しています。すべての項目が繰り返されたら、targetProject.addAll(items). とはいえ、違いはわかりませんでした。

これを行うより良い方法はありますか?第 2 レベルのキャッシュとして Ehcache を使用しています。私もまだ Hibernate 3.2.5 を使用しています。

どんな助けでも大歓迎です。

4

1 に答える 1

1

を頻繁に使用しているため、コードが発行するデータベースクエリが多すぎるようですcreateFilter()

いくつかのクエリで必要なすべてのオブジェクトをメモリにフェッチしてから、適切なメモリ内データ構造(Maps、Sets)を使用して必要なチェックを実行することをお勧めします。

于 2012-02-02T18:41:34.857 に答える