2012-01-03 17 views
11

Doctrineエンティティを更新して、(非常に大きな)XMLファイル内のレコードと一致させる必要があります。 ManyToManyの関連付けは、XMLのデータに従って更新する必要があります。doctrine2 - フラッシュ効率を改善するにはどうすればよいですか?

  1. (現在のエンティティの関連付けを取得するXMLからデータを取得
  2. DBから取得エンティティ(存在しないことは、新規作成した場合)
  3. が設定した新しいエンティティプロパティ:これは私がループの内側に何をすべきかですゲッタ)は、サブループ内
  4. ArrayCollection::add()を呼び出すことによって ArrayCollection::clear()
  5. 設定された新たな関連付けを(呼び出すことによって(ArrayCollectionオブジェクト)
  6. 明確なすべての関連付けを返します
  7. は IはEntityManager::flush()呼び出しループ後のEntityManager

によってエンティティを永続化します。

問題は、一度に複数の行を更新/挿入/削除する代わりに、大量のクエリを生成することです。

  • SELECT(これは実際にはプロパティが変更されないようになりましスキップ...まださ)
  • は以前クリアするDELETEエンティティプロパティを更新するためのUPDATE
  • DB
  • からエンティティを取得する:すべてのエンティティのために、次のクエリを実行しています新団体

を挿入する団体

  • INSERTだから、XMLで305のレコードの合計に私は目を作る915個のクエリを(私はすべてのエンティティが変更となる場合、それは1220のクエリに上がることができると思います)を取得します非常に遅いです。

    ループ前にIdentityMapとプリフェッチエンティティを利用できますが、依然としてUPDATE/DELETE/INSERTクエリがあります。

    • flushメソッドが良いのクエリを(などのクエリをDELETEではなく、複数のマルチ挿入し、使用)を最適化できるようにする方法はありますか?
    • これはflushメソッドの通常の動作ですか?何か間違っていますか?
    • おそらくエンティティの関連付けを更新する方法に問題があります。どのようにこれを行うより良い方法はありますか? (get/clear/addメソッドの代わりに)
    • 私はDoctrineが大量のベック処理を意図していないことを認識していますが、XMLのインポートにこれを使用するのがDB非同期性を避ける方法ですORMではないアプローチです。そうですか?
    • 上記の方法が間違っている場合は、どのように問題を解決する必要がありますか?
  • 答えて

    関連する問題